自有型的关系

max*_*e51 11 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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,EF Core给了我以下错误:

不支持从"RequestHistoryEntry"到"InboundRequest.History #RequestHistory.HistoryEntries"的关系,因为拥有的实体类型"InboundRequest.History #RequestHistory"不能在主体端.

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

小智 1

与自有类型建立一对多关系的唯一方法是自有实体位于关系多方,在这种情况下,ef core 会按照约定将其映射到单独的表。您正在尝试的事情本身在设计上是不可能的。但是,在您的特定情况下,为什么不完全摆脱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);
Run Code Online (Sandbox Code Playgroud)

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