我使用的是代码优先的方法,我试图改变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");
}
问题是,当创建数据库时,它会将表创建为:
表:人
人格化内联pk
名字nvarchar(50)
表:官员
人格化的主键,FK
ISmanager位
办公室内部
在我看来,这是错误的,因为它不符合传统的命名约定,即tablenameid。
非常感谢你在这方面的帮助。
提前谢谢你,奥南。
最佳答案
实体框架忽略这一行…
modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);
…因为不能为派生实体单独定义键,只能为在此完成的基实体
Person
定义键:modelBuilder.Entity<Person>().HasKey(x => x.PersonId);
然后,该键和相应的列名
PersonId
用于所有基实体和派生实体的表。代码优先不能给派生表中的键列起基础表以外的另一个名称。派生实体
OfficerId
中的Officer
被视为普通标量属性,在表中显示为OfficerId INT
而不是PK
。关于命名约定,您可以认为
Officer
是Person
,因此调用键PersonId
可能是有意义的。好吧,这更多的是从面向对象的角度而不是从关系和表的角度来看的命名约定。关于c# - Entity Framework 和OnModelCreating(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16654863/