- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将两个派生类映射到两个表(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; }
}
表已经存在(即我无法修改模式)并且定义如下:
请注意,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 -> 查看实体数据模型
得到这个:
请注意实体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");
}
}
这最终产生了正确的映射:
关于entity-framework - 使用 TPT 的 EF 继承 - 如何指定外键列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002387/
在我的项目中,我使用 TPT 作为测试环境,我们使用基于模型的测试。代码覆盖率通常在 80% 左右。但是客户要求100%的覆盖率,所以想用.c和.h文件进行测试。 我是这类测试的新手,因为我们只进行了
我首先使用代码,然后使用 TPT 继承。正在生成实体的基本类型表,但其主键上没有标识。 (如果有帮助,我可以发布代码)我的个人表有一个主键,但没有“是身份”。子类表按预期生成。 由于它没有为基本类型生
我正在编写一个使用继承的应用程序,我试图将其映射到具有 TPT 结构的 SQL Server 数据库。 但是,出于某种原因,EF 在父类(super class)表和子类表中生成了重复的外键。 我有这
我在我的数据库中创建了大量的表,以下是有问题的表: Table Name -Item ItemID - PK (Auto Increment) Title Table N
我正在尝试使用 TPT java api 来实现项目的一些自动化。 并尝试使用函数“generateTestCasesFromTestData”“添加步骤列表”但无法弄清楚从哪里获取其第一个参数“Sc
如何确定具有 TPT 继承的实体的子类型? 如果我有一个基类 Person 和两个子类 Manager 和 Customer,应该可以查询所有的人,然后通过使用 GetType 方法按他们的子类分组,
我有一个带有 TPT 继承映射的项目,现在我需要给它添加一个搜索功能,以便在多个表中查找记录。这就是我目前拥有的: public abstract class Customer { publi
我们正在使用 C# MVC .NET4。 EF5(代码优先)。 我们正在尝试构建一个系统,该系统应动态允许用户将额外属性“附加”到任何实体。 假设我们有 ProductClass 和 Products
我的域实体正在使用 EF Table Per Type Inheritance,这是关系。 如您所见,发票位于父实体 Order.cs 上。这让我现在在处理发票时遇到问题。 例如,要创建发票,我需要将
我有这个数据库结构: 服务 Id 整数 PK CategoryId FK 一些其他领域 本地化服务 LocalizedServiceId 公钥 LanguageId FK 姓名 描述 如您所见,我有一
我将 EF 与代码优先和 TPT(每个类型的表)继承结合使用。我有以下模型: public partial class AccountHolder { public int AccountHo
概览 我首先使用实体框架 4.3 代码和流畅的界面来设置我的 DbContext。我有一个基 Item 类,其中包含继承它的其他类型,例如 Event、BlogPost、ForumThread、W
在 Entity Framework 的早期版本中,在使用 Table per Type 继承时存在一些严重的性能问题,如下所述: http://www.codeproject.com/Article
考虑以下具有 TPT 继承的 Entity Framework 模型。 数据库表: Person (PersonID, Name) Student (PersonID, Grade) EF 实体: P
我试图达到的是使用 TPT 继承的 AbstractUser 和 Plant 之间的 NM 关系。 当我尝试配置关系时, modelBuilder.Entity().HasMany(c => c.Re
我们的系统正在接收来自两个外部来源的输入(电话/网络提交)。 // Table-Per-Type Hierarchy public class Submission { public int
我有一个关于 TPT + EF6 的大问题。 在我的数据库模型中,我有一张表 Person(我的应用程序中人员的基本信息),并且我有用于 Supplier 和 Consumer 的表. 我的类(cla
我想在 EF 中实现以下模型作为 TPT 设计。 我的代码如下: 基础型号 public abstract class Product { public int Id { get; set;
这个问题会围绕Account、IndividualAccount、Doctor这3个class进行说明: 前两个类是抽象的 IndividualAccount 是 Account 的子类 Doctor
针对遗留数据库使用 Entity Framework 4.1,我无法生成工作的 TPT 继承模型集,这些模型没有复数化并且对公共(public)主键使用不同的名称。 我正在使用数据库表 Organiz
我是一名优秀的程序员,十分优秀!