请考虑以下表格设计...
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
的导航属性中。