【发布时间】:2014-04-27 14:50:17
【问题描述】:
我有一个非常奇怪的情况,特别是一门课。将类添加到DbContext 以插入数据库并首先调用Db.SaveChanges 代码/ef 不会将主键ID 分配回类。
真的很奇怪,我以前从未遇到过这种情况,我似乎无法在网上找到任何解决方案。
这是当前代码的样子...
发票代码一等
[Table("invoice")]
public class Invoice
{
[Key]
[Column("invoice_id")]
public int InvoiceId { get; set; }
[Column("invoice_credit_card_payment_id")]
public int InvoiceCreditCardPaymentId { get; set; }
[Column("batch_id")]
public int BatchId { get; set; }
[Column("customer_id")]
public int CustomerId { get; set; }
etc.....
}
将发票插入数据库的代码
var invoice = new Invoice()
{
BatchId = 0,
Memo = "",
PayDateTime = DateTime.Now,
QuickbooksAccountName = "",
QuickbooksId = "",
Terms = "",
etc....
};
DbContext.Current.Invoices.Add(invoice);
//Invoice record does insert successfully!
DbContext.Current.SaveChanges();
//This returns ZERO
var id = invoice.InvoiceId;
附加说明
附带说明,发票记录已成功插入数据库,但是 ID 并未分配回发票对象。
另一个注意事项 - 我有大约 30 个其他代码优先类,它们在执行插入和获取 ID 时工作得很好 - 正是这个因为一些奇怪的原因给我带来了问题。
根据 jwatts1980 推荐
我更新了发票类以反映这一点
[Key]
[Column("invoice_id")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int InvoiceId { get; set; }
这并没有立即解决问题,但是在插入时确实显示了一个新错误:
ReferentialConstraint 中的依赖属性映射到存储生成的列。列:'invoice_id'
我找到了一个stackoverflow answer here,它引导我找到我在发票类中设置的一些外键属性:
[ForeignKey("InvoiceId")]
public ICollection<InvoiceOrder> InvoiceOrders { get; set; }
[ForeignKey("InvoiceId")]
public InvoiceCreditCardPayment InvoiceCreditCardPayment { get; set; }
到目前为止,删除上面的ForeignKey 属性似乎可以解决问题。我不能说它不会导致其他错误,但是到目前为止一切似乎都运行良好。
【问题讨论】:
-
你在插入新记录时是否签入数据库,InvoiceId 的值是多少?
-
是的,InvoiceId 是自动递增的 int ID - 最后一个创建的是 90761
-
有没有人找到解决方案,因为我面临同样的问题。数据被插入,但对象 ID 未在 SaveChanges() 之后分配。
标签: c# asp.net entity-framework ef-code-first