Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于所属类型的关系_C#_Entity Framework Core - Fatal编程技术网

C# 关于所属类型的关系

C# 关于所属类型的关系,c#,entity-framework-core,C#,Entity Framework Core,我想在一个拥有的类型上定义一对多关系 在我的例子中 InboundRequest:主体实体 RequestHistory:拥有的类型 RequestHistoryEntry:依赖项实体 public类InboundRequest:IAggregateRoot { public int Id{get;private set;} 公共请求历史记录{get;private set;} } 公共类请求历史记录 { 公共IList历史条目{get;set;} } 公共类RequestHistoryEn

我想在一个拥有的类型上定义一对多关系

在我的例子中

  • InboundRequest:主体实体

  • RequestHistory:拥有的类型

  • RequestHistoryEntry:依赖项实体

public类InboundRequest:IAggregateRoot
{
public int Id{get;private set;}
公共请求历史记录{get;private set;}
}
公共类请求历史记录
{
公共IList历史条目{get;set;}
}
公共类RequestHistoryEntry
{
公共请求状态状态{get;private set;}
公共日期时间时间戳{get;private set;}
公共int Id{get;set;}
}
builder.Entity().OwnsOne(x=>x.History);
不幸的是,EF Core给了我以下错误:

“RequestHistoryEntry”与的关系 “InboundRequest.History#RequestHistory.HistoryEntries”不可用 受支持,因为拥有的实体类型为 “InboundRequest.History#RequestHistory”不能位于主体上 一边


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

无法将对象列表设置为拥有的类型,因为历史记录表的列已添加到InboundRequest表中。表的列计数必须是固定的,而不是动态的

如果您编写以下内容:

public RequestHistoryEntry HistoryEntries { get; set; }
然后,您的InboundRequest表如下所示(或类似):

|Id | RequestHistory_State | RequestHistory_Timestamp | RequestHistory_Id|

如果您使用的是RequestHistoryEntry列表,则列计数不清楚。
因此,您必须为其使用单独的表。

与所属类型建立一对多关系的唯一方法是,如果所属实体位于关系的基础上,在这种情况下,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);
public类InboundRequest:IAggregateRoot
{
public int Id{get;private set;}
公共IList历史条目{get;set;}
}
公共类RequestHistoryEntry
{
公共请求状态状态{get;private set;}
公共日期时间时间戳{get;private set;}
公共int Id{get;set;}
}
builder.Entity().OwnsMany(x=>x.HistoryEntries);

这将消除错误,并实现与从属实体的理想关系。

为什么要使用自有类型?您想要实现什么表结构?我在BoundRequest和RequestHistoryEntry中有两个表。我知道我可以在没有自己的类型的情况下完成它,但为了代码清晰起见,我想这样做。你的答案是完全错误的@Marco。在ef core中,拥有一个拥有类型的列表是绝对可能的。但是,从
RequestHistory
类中拥有指向另一个非所有实体的导航属性是非法的,因为根据定义,RequestHistory是其所有者的一部分,不应直接引用外部对象。
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);