【问题标题】:Querying a record with EF returns a null GUID primary key while it's not使用 EF 查询记录返回空 GUID 主键,而它不是
【发布时间】:2021-10-25 01:09:22
【问题描述】:

我正在尝试查询单个记录并更新一个值,但是当我调用 SaveChanges() 方法时,我得到了 DbUpdateConcurrencyException

据我了解。调用异常是因为查询返回的记录主键为空,但在数据库中,记录确实有 ID。

为了您的信息,我使用 Guid 作为主键,它是在添加时生成的

我使用代码优先的方法来创建我的 SQL Server 数据库。

有什么可能导致这种情况的想法吗?

更新:经过进一步调试,似乎我的 Invoice 对象是通过使用错误的构造函数创建的(我为别的东西实现了它)添加了一个公共 Invoice();似乎阻止它通过另一个构造函数,但 Id 值是这个空(其他字段设置正确)

这是我的实现的简化版本:

Invoice

public class Invoice
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    
    public string InvoiceNumber { get; set; }

    ...

    public Invoice (Guid owner, Guid id, string fileName, long fileSize)
    {
        Owner = owner;
        FileId = id;
        FileName = fileName;
        FileSize = fileSize;
    }
}

OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Invoice>(entity =>
    {
        entity.Property(e => e.Id)
            .ValueGeneratedOnAdd();

        entity.Property(e => e.InvoiceNumber);
    });

    OnModelCreatingPartial(modelBuilder);
}

记录更新

using (var db = new TheCompanyDbContext())
{
    Invoice invoice = db.Invoices.Where(x => x.ShouldBeExtracted == true).FirstOrDefault();

    if (invoice != null)
    {
        invoice.InvoiceNumber = "does this work";
        db.SaveChanges();
    }
}

我在数据库中的Id 列定义:

我要更新的记录:

查询检索到的值:

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    好的,我为类发票使用的构造函数似乎引起了问题。 我创建了一个默认的,它似乎解决了这个问题

    public Invoice() { }
    

    【讨论】:

    • 确实;看起来 EF 使用了您的构造函数,但您的构造函数从未真正设置 Id,因此它保持默认值。通过提供一个空的构造函数,EF 可以改用 new Invoice(){ Id = ... 这样的模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多