【问题标题】:Entity Framework Inheritance: Foreign Key in the same table实体框架继承:同一张表中的外键
【发布时间】:2020-01-24 03:27:09
【问题描述】:

我正在使用实体框架。我正在使用继承,它将不同的对象类型放在同一个表中(通过鉴别器)。

但是,这会导致一个问题,因为同一个表中的对象之间的关系无法通过外键来说明。任何建议如何解决?下面是一些代码。

public abstract class DivBase
{
    public int Id { get; set; }

    [Required]
    public DateTimeOffset DateCreated { get; set; }

    [Required]
    public int CreatedByUserId { get; set; }

    [Required]
    public DateTimeOffset DateModified { get; set; }

    [Required]
    public int ModifiedByUserId { get; set; }
}
public abstract class DivClaim : DivBase
{
    [Required]
    [MaxLength(256)]
    public string ClaimType { get; set; }

    [Required]
    [MaxLength(256)]
    public string Name { get; set; }

    [MaxLength(10000)]
    public string Description { get; set; }

    public ICollection<DivUserClaim> UserClaims { get; set; }
}

public class DivCustomer : DivClaim
{
    public ICollection<DivProject> Projects { get; set; }
}

public class DivProject : DivClaim, IDivEvent
{
    public int CustomerId { get; set; }
    public DivCustomer Customer { get; set; }
    public DateTimeOffset StartDate { get; set; }
    public DateTimeOffset EndDate { get; set; }
}

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    在这种情况下,您的基类只是为所有实体定义了公共属性,只需从 DbContext 中排除该基类。您的每个实体都将获得自己的表,但它们都将具有从基类继承的属性。您将无法查询基本实体类型。

    【讨论】:

    • 我希望它们在同一个表中的原因是它们共享同一个 ID 池。这使我可以测试来自一组 ID 的声明。还有其他建议吗?
    • 如果您使用的是 SQL Server(或其他一些服务器),您可以使用单个共享 SEQUENCE 来生成键值。 docs.microsoft.com/en-us/sql/t-sql/statements/… 你真的不希望你所有的实体都在一个表中。外键问题只是众多问题中的第一个。
    • 你将如何在 EF 中使用序列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多