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