it-swarm.com.de

So legen Sie den Primärschlüsselnamen in EF-Code-First fest

Ich verwende Entity Framework Codefirst, um meine Datenbank zu erstellen. Der Standard-Primärschlüssel mit dem Schemanamen dbo.pk_Jobs scheint Zugriff 2007 zu stören, wenn ich über ODBC eine Verbindung dazu herstelle. Wenn ich den Namen manuell bearbeite, den Schemanamen entferne und diesen Primärschlüssel in pk_jobs umbenenne, kann Access die Tabelle jetzt lesen. 

Kann ich den Namen des Primärschlüssels angeben, um den Namen des Schemas nicht mit Fluent Api, Datenattributen oder einer anderen Methode anzugeben. 

public class ReportsContext : DbContext
{
    public DbSet<Job> Jobs { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Job>().ToTable("Jobs");
        modelBuilder.Entity<Job>().HasKey(j => j.uuid);

        base.OnModelCreating(modelBuilder);
    }
}
public class Job
{
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}
25
tourdownunder

Wenn Sie den Spaltennamen angeben und den Eigenschaftennamen überschreiben möchten, können Sie Folgendes versuchen:

Anmerkungen verwenden

public class Job
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("CustomIdName")]
    public Guid uuid { get; set; }
    public int active { get; set; }
}

Zuerst Code verwenden

    protected override void OnModelCreating(DbModelBuilder mb)
    {
        base.OnModelCreating(mb);

        mb.Entity<Job>()
            .HasKey(i => i.uuid);
        mb.Entity<Job>()
          .Property(i => i.uuid)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
          .HasColumnName("CustomIdName");
    }

In der Migrationskonfiguration

public partial class ChangePrimaryKey : DbMigration
{
    public override void Up()
    {
        Sql(@"exec sp_rename 'SchemaName.TableName.IndexName', 'New_IndexName', 'INDEX'");
    }

    public override void Down()
    {
        Sql(@"exec sp_rename 'SchemaName.TableName.New_IndexName', 'Old_IndexName', 'INDEX'");
    }
}
52
cubski

Sie können das Attribut Key verwenden, um die Teile des Primärschlüssels anzugeben. So könnte Ihre Job-Klasse sein

public class Job
{
    [Key]
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}

Die Datenanmerkungsattribute werden im Namespace System.ComponentModel.DataAnnotations definiert

7
Chris Dunaway

Nach meinem Verständnis fragen Sie, wie Sie den Namen der von Entity Framework verwendeten Primärschlüsselspalte ändern können. Der folgende Zusatz zu Ihrer HasKey-Anweisung sollte dies berücksichtigen:

modelBuilder.Entity<Job>().Property(j => j.uuid).HasColumnName("pk_Jobs")
1
Jeff Siver

(Dies ist eine Ergänzung zu der Antwort/den Kommentaren von @Jeff Sivers und @cubski.)

Soweit ich weiß, können Sie den PK-Namen nicht mit Datenattribut angeben. Manchmal muss ich den dbo.-Teil des Namens entfernen und verwende dann einen manuell bearbeiteten Code, um den Namen wie folgt zu ändern:

public partial class ChangeNameOnPKInCustomers : DbMigration
{
    private static string fromName = "PK_dbo.Customers";    // Name to change

    private static string toName = fromName.Replace("dbo.", "");

    public override void Up()
    {
        Sql($"exec sp_rename @objname=N'[dbo].[{fromName}]', @newname=N'{toName}'");
        // Now the PK name is "PK_Customers".
    }

    public override void Down()
    {
        Sql($"exec sp_rename @objname=N'[dbo].[{toName}]', @newname=N'{fromName}'");
        // Back to "PK_dbo.Customers".
    }
}
1
savehansson

Wenn Sie eine explizite Migration mithilfe von Code First hinzufügen, erhalten Sie eine CS-Datei mit dem Namen der Migration, die eine Teilklasse mit der Basisklasse DbMigration ist. 

Für Ihre Primärschlüsseleinschränkung haben Sie entweder die DropPrimaryKey- oder die AddPrimaryKey-Funktion, je nachdem, was Sie versuchen. Mein Problem war mit DropPrimaryKey, da meine Db einen anderen Namen für den Primärschlüssel hatte.

Beide Funktionen verfügen über Überladungen, um den Namen der PK zu übernehmen, sodass Sie den Namen der PK explizit angeben können. Funktionierte gut für DropPrimaryKey mit explizitem PK-Namen. Das Argument ist object anonymousArguments, das standardmäßig null ist.