簡體   English   中英

如何在EF-Code-First中指定主鍵名稱

[英]How to Specify Primary Key Name in EF-Code-First

我正在使用Entity Framework Codefirst來創建我的數據庫。 當我通過ODBC連接到它時,具有模式名稱dbo.pk_Jobs的默認主鍵似乎擾亂了訪問2007。 如果我手動編輯名稱並刪除模式名稱並將此主鍵重命名為pk_jobs,則Access現在可以讀取該表。

是否可以使用Fluent Api,數據屬性或任何其他方法指定主鍵名稱不包括架構的名稱。

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; }
}

如果要指定列名稱並覆蓋屬性名稱,可以嘗試以下操作:

使用注釋

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

使用Code First

    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");
    }

內部遷移配置

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'");
    }
}

您可以使用Key屬性指定主鍵的各個部分。 所以你的Job類可能是

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

數據注釋屬性在System.ComponentModel.DataAnnotations命名空間中定義

如果我理解,您詢問如何更改Entity Framework使用的主鍵列的名稱。 以下對HasKey語句的補充應該注意這一點:

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

(這是@Jeff Sivers和@cubski的答案/評論的補充。)

據我所知,您無法使用數據屬性指定PK名稱。 有時我需要擺脫dbo. 部分名稱然后我使用手動編輯的代碼首次遷移來更改名稱,如下所示:

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".
    }
}

使用Code First添加顯式遷移時,會得到一個帶有遷移名稱的.cs文件,該文件是具有基類DbMigration的分部類。

對於主鍵約束,您可以使用DropPrimaryKey或AddPrimaryKey函數,具體取決於您要執行的操作。 我的問題是使用DropPrimaryKey,因為我的Db具有不同的主鍵名稱。

這兩個函數都有重載來獲取PK的名稱,以便您可以顯式指定PK的名稱。 對於具有顯式PK名稱的DropPrimaryKey,我工作得很好。 對象anonymousArguments的參數默認為null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM