gpt4 book ai didi

entity-framework - 使用 TPT 的 EF 继承 - 如何指定外键列名称?

转载 作者:行者123 更新时间:2023-12-02 17:32:38 27 4
gpt4 key购买 nike

我想将两个派生类映射到两个表(TPT)

[Table("User")]
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}

[Table("Employee")]
public class Employee : User
{
public int UserId { get; set; }
public string DeptName { get; set; }
}

表已经存在(即我无法修改模式)并且定义如下:

enter image description here

enter image description here

请注意,Employee 表中的 UserId 列既是它的主键,也是表 User 的外键, 列编号

DbContext 尽可能直接 - 没有定义流畅的映射。

public class TestInheritContext : DbContext
{
public DbSet<User> Users { get; set; }
}

尝试访问 Users 集合时,出现以下 EF 异常:

System.Data.SqlClient.SqlException: 列名称“Id”无效。

显然,它尝试从表 Employee 中读取列 Id

我见过的所有 TPT 示例在所有表中都使用相同的 PK 列名称。例如,this one .

我该如何解决?

最佳答案

想通了。

首先,为了对此进行调试,查看 EF 在幕后创建的实际映射很有帮助。

我安装了 EF Power Tools VS 扩展,r-单击上下文文件,

Entity Framework -> 查看实体数据模型

得到这个:

enter image description here

请注意实体Employee 拥有自己的UserId 属性继承的Id 属性。

所以我做的第一件事就是从派生类中删除 UserId 属性:

[Table("Employee")]
public class Employee : User
{
// not needed
//public int UserId { get; set; }

public string DeptName { get; set; }
}

但这还不够。我现在有来自基类的 Id 属性,它必须指向两个不同名称的列,具体取决于它来自哪个表/实体:

对于用户:Id => Id
对于 Employee:Id => UserId

我无法为此使用属性,所以我将使用流畅的语法。

对于 User 实体,我不必做任何事情,因为列名称与属性名称匹配。

对于 Employee 实体,我必须进行干预:

public class TestInheritContext : DbContext
{
public DbSet<User> Users { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.Property(e => e.Id)
.HasColumnName("UserId");
}
}

这最终产生了正确的映射:enter image description here

关于entity-framework - 使用 TPT 的 EF 继承 - 如何指定外键列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002387/

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