首页 文章

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

提问于
浏览
26

我正在使用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; }
}

5 回答

  • 1

    如果我理解,您询问如何更改Entity Framework使用的主键列的名称 . 以下对HasKey语句的补充应该注意这一点:

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

    如果要指定列名称并覆盖属性名称,可以尝试以下操作:

    使用注释

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

    您可以使用 Key 属性指定主键的各个部分 . 所以你的Job类可能是

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

    数据注释属性在System.ComponentModel.DataAnnotations namespace中定义

  • 1

    (这是@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".
        }
    }
    
  • 7

    使用Code First添加显式迁移时,会得到一个带有迁移名称的.cs文件,该文件是具有基类DbMigration的部分类 .

    对于主键约束,您可以使用DropPrimaryKey或AddPrimaryKey函数,具体取决于您要执行的操作 . 我的问题是使用DropPrimaryKey,因为我的Db具有不同的主键名称 .

    这两个函数都有重载来获取PK的名称,以便您可以显式指定PK的名称 . 对于具有显式PK名称的DropPrimaryKey,我工作得很好 . 对象anonymousArguments的参数默认为null .

相关问题