一个外键多个表

时间:2019-05-22 16:13:29

标签: c# entity-framework-core

请考虑以下表格设计...

Order
  Id UNIQUEIDENTIFIER

OrderLine
  Id UNIQUEIDENTIFIER
  OrderId UNIQUEIDENTIFIER

Connection
  Id UNIQUEIDENTIFIER
  FromEntityId UNIQUEIDENTIFIER
  ToEntityId UNIQUEIDENTIFIER

它允许通过Connection表将任何表链接到任何其他表。另一种方法是为每个单个组合创建一个ConnectionFromTxToTy表。在我们的架构中,这意味着创建70个! (!为阶乘)表仅用于此功能。最重要的是,这意味着向每个类添加70个导航属性。这远非容易实现或消耗。

可以向我的模型添加导航属性“连接”。确实可以查看链接到单个实体的所有连接(只要我将它们加倍)。

order
    .HasMany(entity => entity.Connections)
    .WithOne()
    .HasForeignKey(entity => entity.FromEntityId)

但是,我想更进一步,实际上可以像其他实体一样包含链接的实体。当然,缺点是EntityFrameworkCore不支持此功能。我无法创建像下面这样的类,并且不能期望它开箱即用。

public class Connection
{
    public Guid Id { get; set; }

    public Guid FromEntityId { get; set; }

    public Guid ToEntityId { get; set; }

    public virtual object FromEntity { get; set; }

    public virtual object ToEntity { get; set; }
}

一旦我尝试将其包含在Orders.Include(order => order.Connections).ThenInclude(connection => connection.ToEntity)中,我将失去所有键入的功能。但是,如果可以执行以下操作,我可以接受:Orders.Include(order => order.Connections).ThenInclude(connection => connection.ToEntity).ThenInclude(orderLine => ((OrderLine)orderLine).Order)

当前,我已将链接的实体作为JSON包含在内,但这显然意味着在那之后我失去了所有包含功能。但更糟糕的是,我分配给该类型的任何ValueConverters都没有执行。

我该如何应对这一挑战?我不确定什么是最好的路径:virtual IDictionary<string, object>路由或virtual object路由或其他。我觉得我可能可以通过自定义QueryModelGenerator和自定义SqlServerQuerySqlGeneratorFactory到达那里,尽管我不知道仅此一个是否足够。但是EntityFrameworkCore已将我停在类型为object的导航属性中。

0 个答案:

没有答案