【问题标题】:Mutually Inclusive Inheritance with Entity Framework实体框架的相互包容继承
【发布时间】: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


【解决方案1】:

你想要达到的目标是不对的。使用 ORM 时,请尝试从对象的角度进行思考。获取数据时,无法转换的用户有两种具体类型。

您需要从不同的角度看待问题并相应地设计您的对象关系。您需要在这里使用组合而不是继承。

【讨论】:

  • 你的回答对他来说太苛刻了:D
  • 是的,没错。但我想到,如果我可以将 EF 配置为在 Customer 和 Employee 中有不同的主键,而不是让 UserAccount.Id 主键和外键,那么我可能会解决这个问题。你能想到无论如何配置它。如果我找不到任何好的解决方案,当然组合是我的后备方法。
【解决方案2】:

目前User 可以同时拥有CustomerEmployee 条目以及相同的primary key。因此,当您告诉 Entity Framework 选择所有 Users 时,您会在 User.Id 列上遇到冲突。

我假设您希望每个 CustomerEmployee 都有一个 User 条目。

您可以通过删除继承来做到这一点。

示例

public class UserAccount
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public Employee Employee {get;set;}
    public Customer Customer {get;set;}
}

public class Employee 
{
    public User User {get;set;}
}

public class Customer
{
    public User User {get;set;}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2010-10-07
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多