Dr *_*izo 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 OfficerId { get; private set; }
public bool IsManager { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的 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");
}
Run Code Online (Sandbox Code Playgroud)
问题是当我的数据库创建时,它创建的表如下:
表:人员 PersonId INT PK Forename nvarchar(50)
表: 官员 PersonId INT PK、FK IsManager BIT 官员 ID INT
对我来说,这看起来是错误的,因为它不遵循传统的命名约定,即 TableNameId。
非常感谢对此的任何帮助。预先感谢,奥南。
实体框架忽略这一行...
modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);
Run Code Online (Sandbox Code Playgroud)
...因为您无法为派生实体单独定义键,只能为Person您在此处完成的基本实体定义键:
modelBuilder.Entity<Person>().HasKey(x => x.PersonId);
Run Code Online (Sandbox Code Playgroud)
然后,该键和相应的列名称PersonId将用于基础实体和派生实体的所有表。使用 Code-First 无法为派生表中的键列指定与基表中不同的名称。
OfficerId派生实体中的被Officer视为普通标量属性,并且它在表中显示为OfficerId INT不是PK。
关于命名约定,您可能会认为 anOfficer 是 a Person,因此调用 key 可能是有意义的PersonId。嗯,这更多的是从面向对象而不是关系和表的角度来看的命名约定。
| 归档时间: |
|
| 查看次数: |
22883 次 |
| 最近记录: |