【问题标题】:Db.SaveChanges Not Assigning Primary Key ID After Insert - Code First Entity Framework插入后 Db.SaveChanges 未分配主键 ID - 代码优先实体框架
【发布时间】: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


【解决方案1】:

这个属性可能会有所帮助

[Key]
[Column("invoice_id")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int InvoiceId { get; set; }

【讨论】:

  • 马上试一试,让你知道...谢谢
  • 我不确定这会改变什么。 int 键字段的默认约定已经是一个身份。他还提到记录已正确插入。似乎发生了其他奇怪的事情。
  • 我曾经遇到过这样的情况,忘记将字段设置为数据库端的主键。
  • 嗨 jwatts - 我已经更新了我的问题,您的回答并没有立即解决问题 - 但是它确实导致了解决方案。我投票赞成您的答案,因为它帮助我找到了解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2013-01-15
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多