.NET中的EntityFramework - 将子实体添加到现有父实体时,正在验证/添加父实体

时间:2017-03-28 07:51:40

标签: c# asp.net entity-framework

我正在使用.NET的EntityFramework,其中包括实体Invoice(父级)和收据(子级)。它们的建模如下所示:

public class Invoice
{       
  public int InvoiceID { get; set; }

  [Required(ErrorMessage = "Field Date is mandatory for the invoice.")]
  public DateTime Date { get; set; }
  ...
  public virtual ICollection<Receipt> Receipts { get; set; }
}

public class Receipt
{     
  public int ReceiptID { get; set; }
...
  public int? InvoiceID { get; set; }    
  public Invoice Invoice { get; set; }
}

我已在数据库中添加了发票。问题是当我尝试为它添加收据时。为了做到这一点,我使用FormView,其属性为ItemType =&#34; Models.Receipt&#34;,ValidateRequestMode =&#34; Enabled&#34;,InsertMethod =&#34; AddReceipt&#34;:

public void AddReceipt(Models.Receipt receiptObj)
{
  receiptObj.InvoiceID = intInvoiceID; //from POST
  if (ModelState.IsValid)
    {
       var _db = new Models.InvoiceContext();
       _db.Receipts.Add(receiptObj);
       _db.Entry(receiptObj).State = System.Data.Entity.EntityState.Added;
      _db.SaveChanges();            
    }
 }

ModelState.IsValid返回false。错误消息为&#34;发票必须提供字段日期。&#34; - 但我不想添加发票!当我检查&#34; ModelState&#34;在Debug中,在ModelState.Keys中我看到了值&#34; Invoice.InvoiceNumber&#34;和&#34; Invoice.InvoiceDate&#34; ...?

如果我尝试加载发票

receiptObj.Invoice= GetInvoice(intInvoiceID);

我仍然得到相同的验证错误,即使我在Debug中查看发票。比尔,我看到它已正确加载 - 包括日期字段。 (但是以这种方式提取发票是不行的,因为当我解决验证问题时我会收到另一个错误,因为当我调用GetInvoice(intInvoiceID)时我使用不同的上下文而我无法将发票对象附加到两种不同的背景。)

我已经坚持了一段时间,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我发现了问题!我发布它以防其他人遇到它。

在我用于插入/更新收据的FormView中,我有一个显示发票编号的标签。

<asp:Label ID="lblInvoiceNumber_edit" Text='<%# Bind("Invoice.InvoiceNumber") %>' runat="server"></asp:Label>

由于Bind,每次我尝试插入/更新收据时,上下文也试图插入新发票 - 但由于此新发票仅绑定了InvoiceNumber字段,因此所有其他字段均为null - 这就是发票的强制性字段日期验证失败的原因。

感谢大家的关注和建议。