我正在使用.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)时我使用不同的上下文而我无法将发票对象附加到两种不同的背景。)
我已经坚持了一段时间,所以非常感谢任何帮助。
答案 0 :(得分:1)
我发现了问题!我发布它以防其他人遇到它。
在我用于插入/更新收据的FormView中,我有一个显示发票编号的标签。
<asp:Label ID="lblInvoiceNumber_edit" Text='<%# Bind("Invoice.InvoiceNumber") %>' runat="server"></asp:Label>
由于Bind,每次我尝试插入/更新收据时,上下文也试图插入新发票 - 但由于此新发票仅绑定了InvoiceNumber字段,因此所有其他字段均为null - 这就是发票的强制性字段日期验证失败的原因。
感谢大家的关注和建议。