C# 实体框架-代码优先/Fluent API-过滤导航属性
我试图用代码优先方法和fluentapi定义以下三个类之间的关系,但我已经走到了死胡同 考虑到以下三类:C# 实体框架-代码优先/Fluent API-过滤导航属性,c#,entity-framework,filter,fluent-interface,navigation-properties,C#,Entity Framework,Filter,Fluent Interface,Navigation Properties,我试图用代码优先方法和fluentapi定义以下三个类之间的关系,但我已经走到了死胡同 考虑到以下三类: 公共类合同{ 公共合同{ this.PaymentRequests=new HashSet(); this.Bills=new HashSet(); } 公共长Id{get;set;} 公共虚拟ICollection PaymentRequests{get;set;} 公共虚拟ICollection票据{get;set;} } 公共课条例草案{ 公共法案{ this.PaymentReque
公共类合同{
公共合同{
this.PaymentRequests=new HashSet();
this.Bills=new HashSet();
}
公共长Id{get;set;}
公共虚拟ICollection PaymentRequests{get;set;}
公共虚拟ICollection票据{get;set;}
}
公共课条例草案{
公共法案{
this.PaymentRequests=new HashSet();
}
公共长Id{get;set;}
公共虚拟契约{get;set;}
公共虚拟ICollection PaymentRequests{get;set}
}
公共类付款请求{
公共长Id{get;set;}
公共虚拟契约{get;set;}
公共虚拟票据{get;set;}
}
我想用以下方式定义这种关系:合同维护一个尚未设置账单的PaymentRequests列表,以及一个包含PaymentRequests列表的账单列表,其中账单设置为当前账单
因此,我尝试相应地设置映射:
公共类ContractMap:EntityTypeConfiguration{
公共合同地图(){
this.HasKey(x=>x.Id);
this.HasMany(x=>x.PaymentRequests)
.需要(pr=>pr.Contract);
这个.有很多(x=>x.Bills)
.需要(b=>b.合同);
}
}
公共类BillMap:EntityTypeConfiguration{
公共BillMap(){
this.HasKey(x=>x.Id);
这是必需的(x=>x.Contract);
this.HasMany(x=>x.PaymentRequests)
.需要(x=>x.账单);
}
}
公共类PaymentRequestMap:EntityTypeConfiguration{
公共PaymentRequestMap(){
this.HasKey(x=>x.Id);
这是必需的(x=>x.Contract);
this.has可选(x=>x.Bill);
}
}
但这并没有真正起作用。是否有可能定义此类关系,或者我是否需要创建另一个成员,例如称为OpenPaymentRequests,并告诉EF忽略它,然后将其填充到(例如)存储库中,并对账单中的PaymentRequests执行相同的操作?我无法在网上找到类似的信息,以获得解决上述问题的最佳实践方法的有用信息。欢迎您的任何意见 您正在通过
ContractMap
和BillMap
类将PaymentRequests
配置为既需要账单
又需要合同
。出于您的目的,PaymentRequest
应该只需要一份合同
-账单
应该是可选的(正如您在PaymentRequestMap
类中选择的那样,由于前两个配置类的原因,实际上不需要它)
公共类ContractMap:EntityTypeConfiguration{
公共合同地图(){
this.HasKey(x=>x.Id);
this.HasMany(x=>x.PaymentRequests)
.需要(pr=>pr.Contract);
这个.有很多(x=>x.Bills)
.需要(b=>b.合同);
}
}
公共类BillMap:EntityTypeConfiguration{
公共BillMap(){
this.HasKey(x=>x.Id);
这是必需的(x=>x.Contract);
this.HasMany(x=>x.PaymentRequests)
//将此更改为.WithOptional(x=>x.Bill)
.可选(x=>x.Bill);
}
}
公共类PaymentRequestMap:EntityTypeConfiguration{
公共PaymentRequestMap(){
this.HasKey(x=>x.Id);
这是必需的(x=>x.Contract);
this.has可选(x=>x.Bill);
}
}
您正在通过
ContractMap
和BillMap
类将PaymentRequests
配置为既需要账单
又需要合同
。出于您的目的,PaymentRequest
应该只需要一份合同
-账单
应该是可选的(正如您在PaymentRequestMap
类中选择的那样,由于前两个配置类的原因,实际上不需要它)
公共类ContractMap:EntityTypeConfiguration{
公共合同地图(){
this.HasKey(x=>x.Id);
this.HasMany(x=>x.PaymentRequests)
.需要(pr=>pr.Contract);
这个.有很多(x=>x.Bills)
.需要(b=>b.合同);
}
}
公共类BillMap:EntityTypeConfiguration{
公共BillMap(){
this.HasKey(x=>x.Id);
这是必需的(x=>x.Contract);
this.HasMany(x=>x.PaymentRequests)
//将此更改为.WithOptional(x=>x.Bill)
.可选(x=>x.Bill);
}
}
公共类PaymentRequestMap:EntityTypeConfiguration{
公共PaymentRequestMap(){
this.HasKey(x=>x.Id);
这是必需的(x=>x.Contract);
this.has可选(x=>x.Bill);
}
}
感谢您的快速回复。您是对的,账单需要在PaymentRequest中是可选的:为了我的理解,Contract.PaymentRequests现在与Bill.PaymentRequests相同,其中Bill与Contract.Bill关联,因此我需要创建类似于上述OpenPaymentRequests的内容,对吗?
dbContext.Entry().Collection(e=>e.).Query()
将为您获取导航集合属性的IQueryable
,您可以筛选和枚举结果感谢您的快速响应。您是对的,账单需要在PaymentRequest中是可选的:为了我的理解合同。PaymentRequests现在与Bill.PaymentRequests相同,其中Bill关联因此,我需要创建类似上述OpenPaymentRequests的东西,对吗?dbContext.Entry().Collection(e=>e.).Query()
将为nav Collection属性获取IQueryable
,您可以过滤和枚举结果
public class ContractMap : EntityTypeConfiguration<Contract> {
public ContractMap() {
this.HasKey(x => x.Id);
this.HasMany(x => x.PaymentRequests)
.WithRequired(pr => pr.Contract);
this.HasMany(x => x.Bills)
.WithRequired(b => b.Contract);
}
}
public class BillMap : EntityTypeConfiguration<Bill> {
public BillMap() {
this.HasKey(x => x.Id);
this.HasRequired(x => x.Contract);
this.HasMany(x => x.PaymentRequests)
// change this to .WithOptional( x => x.Bill )
.WithOptional(x => x.Bill);
}
}
public class PaymentRequestMap : EntityTypeConfiguration<PaymentRequest> {
public PaymentRequestMap() {
this.HasKey(x => x.Id);
this.HasRequired(x => x.Contract);
this.HasOptional(x => x.Bill);
}
}