我想在自有类型上定义一对多的关系。
在我的例子中,
InboundRequest:主体实体
RequestHistory:拥有类型
RequestHistoryEntry:依赖实体
public class InboundRequest : IAggregateRoot
{
public int Id { get; private set; }
public RequestHistory History { get; private set; }
}
public class RequestHistory
{
public IList<RequestHistoryEntry> HistoryEntries { get; set; }
}
public class RequestHistoryEntry
{
public RequestState State { get; private set; }
public DateTime Timestamp { get; private set; }
public int Id { get; set; }
}
builder.Entity<InboundRequest>().OwnsOne(x => x.History);
不幸的是,EF Core给了我以下错误:
从'RequestHistoryEntry'到。的关系 'InboundRequest.History #RequestHistory.HistoryEntries'不是 支持,因为拥有的实体类型 'InboundRequest.History#RequestHistory'不能在主体上 侧。
有没有办法在自有类型和依赖项列表之间建立一对多的关系?
答案 0 :(得分:0)
您不能设置对象作为一个拥有类型的列表,因为你的历史记录表中的列被添加到InboundRequest表。该表的列数必须是固定的,而不是动态的。
如果你写的情况如下:
public RequestHistoryEntry HistoryEntries { get; set; }
然后,您的InboundRequest表看起来像(或类似):
| ID | RequestHistory_State | RequestHistory_Timestamp | RequestHistory_Id |
如果您使用RequestHistoryEntry的列表,然后列计数不明确。 Therfore你必须使用一个单独的表它。
答案 1 :(得分:0)
与拥有的类型建立一对多关系的唯一方法是,如果拥有的实体位于关系的many side上,在这种情况下,ef核心将按惯例将其映射到单独的表。 by design本身是不可能的。但是,在您的特定情况下,为什么不完全放弃RequestHistory
并将RequestHistoryEntry
的列表作为拥有类型的集合添加到InboundRequest
中,如下所示:
public class InboundRequest : IAggregateRoot
{
public int Id { get; private set; }
public IList<RequestHistoryEntry> HistoryEntries { get; set; }
}
public class RequestHistoryEntry
{
public RequestState State { get; private set; }
public DateTime Timestamp { get; private set; }
public int Id { get; set; }
}
builder.Entity<InboundRequest>().OwnsMany(x => x.HistoryEntries);
这应该消除错误,并实现与依赖实体的所需关系。