C# 实体框架和OnModelCreating()

C# 实体框架和OnModelCreating(),c#,entity-framework-5,C#,Entity Framework 5,我使用代码优先的方法,并试图改变EF创建表的方式。我有两个简单的课程: 注意:我每次都会删除并重新创建数据库。这不会发生在现实世界中,但为了测试,我试图拦截创建并强制EF按照我的设想创建数据库 public class Person { public int PersonId { get; private set; } public string Forename { get; set; } } public class Officer : Person { public int O

我使用代码优先的方法,并试图改变EF创建表的方式。我有两个简单的课程:

注意:我每次都会删除并重新创建数据库。这不会发生在现实世界中,但为了测试,我试图拦截创建并强制EF按照我的设想创建数据库

public class Person
{
  public int PersonId { get; private set; }
  public string Forename { get; set; }
}
public class Officer : Person
{
  public int OfficerId { get; private set; }
  public bool IsManager { get; set; }
}
在OnModelCreating()事件中,我有以下内容:

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

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();


        modelBuilder.Entity<Person>().HasKey(x => x.PersonId);
        modelBuilder.Entity<Person>().ToTable("Person");
        modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);
        modelBuilder.Entity<Officer>().ToTable("Officer");
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Conventions.Remove();
modelBuilder.Entity().HasKey(x=>x.PersonId);
modelBuilder.Entity().ToTable(“个人”);
modelBuilder.Entity().HasKey(x=>x.OfficeId);
modelBuilder.Entity().ToTable(“高级职员”);
}
问题是,在创建数据库时,它会将表创建为:

表:人 人格智力测验 名为nvarchar(50)

表:官员 人形输入主键,FK IsManager钻头 officeridint

在我看来,这似乎是错误的,因为它不符合传统的命名约定,即TableNameId

非常感谢您在这方面的任何帮助。
提前谢谢你,奥纳姆。

你的班级结构有点不正确。理想情况下,您应该使抽象类为person,然后从中派生,或者只是从officer类中删除OfficerId。否则在officer表中,personid将作为一个字段,它只是一个冗余字段,您将无法使用它。 所以你能做的是

public class PersonBase {public string ForeName{get; set;}}
public class Person : PersonBase {public int PersonId{get; set;}}
public class Officer : PersonBase{public int OfficerId{get; set;} public bool IsManager{get; set;}}

或者,要更改映射EF字段的列名,您可以使用
[column(name=“COLOUMN name”)]
属性实体框架忽略此行

modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);
然后,该键和相应的列名
PersonId
将用于基础实体和派生实体的所有表。使用“代码优先”无法为派生表中的键列赋予基表以外的名称

派生实体
Officer
中的
OfficerId
被视为普通标量属性,它在表中显示为
OfficerId INT
,而不是
PK


关于命名约定,您可以认为
官员
,因此调用键
PersonId
可能有意义。好的,这更多的是一种面向对象的命名约定,而不是关系和表的观点。

可能的重复-那边的答案是,目前不可能在表中为每种类型场景的子类型重命名PK。谢谢,我查看了您提到的线程,结果证明非常有用。
modelBuilder.Entity<Person>().HasKey(x => x.PersonId);