如何在EF-Code-First中指定主键名称

我正在使用Entity Framework Codefirst来创建我的数据库。 当我通过ODBC连接到它时,具有模式名称dbo.pk_Jobs的默认主键似乎扰乱了访问2007。 如果我手动编辑名称并删除模式名称并将此主键重命名为pk_jobs,则Access现在可以读取该表。

是否可以使用Fluent Api,数据属性或任何其他方法指定主键名称不包括架构的名称。

public class ReportsContext : DbContext { public DbSet Jobs { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().ToTable("Jobs"); modelBuilder.Entity().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() .HasKey(i => i.uuid); mb.Entity() .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().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。