C# 实体框架-代码优先/Fluent API-过滤导航属性

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

我试图用代码优先方法和fluentapi定义以下三个类之间的关系,但我已经走到了死胡同

考虑到以下三类:

公共类合同{
公共合同{
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);
  }
}