【发布时间】:2018-01-18 18:09:55
【问题描述】:
我有一个场景,我需要实现相互包容的继承,并且我使用实体框架代码优先作为 ORM。我有一个抽象的用户类,客户和员工类,它们是从用户继承的。我目前已经实现了 table-per-type 来建模 SQL 数据库中的继承。
现在,每当我尝试使用单个 db 上下文对象获取两个实体时,它都会给我这个异常
EntitySet 'Context.Users' 中的所有对象都必须具有唯一的主对象 键。但是,“员工”类型的实例和类型的实例 'Customer' 都具有相同的主键值, 'EntitySet=Users;Id=153'
我确实了解导致问题的原因,但我找不到任何解决方法。
可能可行的解决方案是我将为客户和员工创建一个单独的主键并将 UserAccountId 保留为外键,但我找不到通过实体框架配置它的方法。
以下是我的场景的虚拟代码
public abstract class UserAccount
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
public class Employee : UserAccount
{
}
public class Customer : UserAccount
{
}
public class CustomerConfiguration : EntityTypeConfiguration<Customer>
{
public CustomerConfiguration()
{
ToTable(nameof(Customer));
}
}
public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
public EmployeeConfiguration()
{
ToTable(nameof(Employee));
}
}
【问题讨论】:
-
请向我们展示您的代码
-
您是否要手动将数据添加到 db,因为 EF 不允许在 Employee 和 Customer 表中为用户条目添加数据。
-
不,我也在使用实体框架插入数据,我面临的错误是在获取而不是在添加数据时。谢谢
-
可以给我们看一下代码吗?
-
这些实体是否有一个
DbSet?另外,请说明您是如何添加数据的。
标签: c# sql entity-framework inheritance