自有型的关系

时间:2018-01-05 10:34:04

标签: c# entity-framework-core

我想在自有类型上定义一对多的关系。

在我的例子中,

  • 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'不能在主体上   侧。

有没有办法在自有类型和依赖项列表之间建立一对多的关系?

2 个答案:

答案 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);

这应该消除错误,并实现与依赖实体的所需关系。