簡體   English   中英

實體框架-代碼優先/ Fluent API-過濾的導航屬性

[英]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執行相同的操作? 我無法在網上找到類似內容,無法獲得解決上述問題的最佳實踐方法的有用信息。 任何輸入都非常歡迎和贊賞!

您正在通過自己的ContractMapBillMap類將PaymentRequests配置為同時要求BillContract 出於您的目的, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM