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

tou*_*der 28 .net c# sql-server entity-framework 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; }
}
Run Code Online (Sandbox Code Playgroud)

cub*_*ski 55

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

使用注释

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

使用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");
    }
Run Code Online (Sandbox Code Playgroud)

内部迁移配置

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'");
    }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*way 7

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

public class Job
{
    [Key]
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

数据注释属性在System.ComponentModel.DataAnnotations命名空间中定义