gpt4 book ai didi

c# - Entity Framework 和 OnModelCreating()

转载 作者:太空狗 更新时间:2023-10-30 01:21:08 26 4
gpt4 key购买 nike

我正在使用代码优先方法,我正在尝试更改 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");
}

问题是当我创建数据库时,它创建的表是:

表:人PersonId INT PK名字 nvarchar(50)

表:官员PersonId INT PK,FKIsManager 位OfficerId 整数

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

非常感谢对此的任何帮助。提前致谢,Onam。

最佳答案

Entity Framework 忽略这一行...

modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);

...因为您不能为派生实体单独定义键,只能为您在此处完成的基本实体 Person 定义键:

modelBuilder.Entity<Person>().HasKey(x => x.PersonId);

此键和相应的列名 PersonId 然后用于基础实体和派生实体的所有表。 Code-First 无法为派生表中的键列提供与基表中不同的名称。

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

关于命名约定,您可能会争辩说 Officer 是一个 Person,因此调用键 可能有意义个人身份。好吧,这更像是一种面向对象的命名约定,而不是关系和表的观点。

关于c# - Entity Framework 和 OnModelCreating(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16654863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com