[英]Entity Framework - Code First / Fluent API - Filtered navigation properties
我正在嘗試使用代碼優先方法和流暢的API定義以下三個類的關系,但是我已經走到了盡頭。
給定以下三個類:
public class Contract {
public Contract {
this.PaymentRequests = new HashSet<PaymentRequest>();
this.Bills = new HashSet<Bill>();
}
public long Id { get; set; }
public virtual ICollection<PaymentRequest> PaymentRequests { get; set; }
public virtual ICollection<Bill> Bills { get; set; }
}
public class Bill {
public Bill {
this.PaymentRequests = new HashSet<PaymentRequest>();
}
public long Id { get; set; }
public virtual Contract Contract { get; set; }
public virtual ICollection<PaymentRequest> PaymentRequests { get; set }
}
public class PaymentRequest {
public long Id { get; set; }
public virtual Contract Contract { get; set; }
public virtual Bill Bill { get; set; }
}
我想通過以下方式定義關系:合同維護一個尚未設置帳單的PaymentRequests清單,以及一個包含將Bills設置為當前帳單的PaymentRequests清單的帳單清單。
因此,我嘗試相應地設置映射:
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)
.WithRequired(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);
}
}
但這並不能真正起作用。 是否有可能定義這種關系,還是我需要創建另一個成員,例如,稱為OpenPaymentRequests,並告訴EF忽略它,然后將其填充到(例如)存儲庫中,並對帳單中的PaymentRequests執行相同的操作? 我無法在網上找到類似內容,無法獲得解決上述問題的最佳實踐方法的有用信息。 任何輸入都非常歡迎和贊賞!
您正在通過自己的ContractMap
和BillMap
類將PaymentRequests
配置為同時要求Bill
和Contract
。 出於您的目的, PaymentRequest
只需要一個Contract
- Bill
應該是可選的(就像您在PaymentRequestMap
類中選擇的PaymentRequestMap
,由於前兩個配置類,實際上並不需要)
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.