实体框架标识列始终为零

时间:2014-03-17 09:17:08

标签: entity-framework identity

我正在使用以下类将产品插入数据库。 ID列是主键。 将多个产品添加到db上下文(不调用savechanges方法)后,所有新添加的行标识列都为零!

我的场景...... 用户添加了几个产品并在数据网格上浏览它们。 用户选择一个产品并向选定的产品添加一些条形码。 当用户完成作业时,单击“保存”按钮,应用程序调用SaveChanges方法!

当用户想要首先向产品添加一些条形码时,我需要从上下文中找到所选产品,并将输入的条形码文本添加到条形码列表中。但我不能这样做因为所有产品标识列的值都相同而且它们都是零。

我该如何解决这个问题?

public class Product
{
    public int ProductID { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }

    public virtual List<Barcode> Barcodes { get; set; }
}

public class Barcode
{
    public int BarcodeID { get; set; }
    public string BarcodeText { get; set; }

    public int ProductID { get; set; }
    public virtual Product Product { get; set; }

}

1 个答案:

答案 0 :(得分:5)

在将记录插入表时,数据库会为标识列值指定。在调用SaveChanges之前,不会执行任何查询,也不会将任何内容传递给数据库并返回。上下文只保留具有适当状态的实体的内存中集合(状态定义在更改保存期间应执行查询的时间 - 对于具有Added状态的新实体,应生成并执行插入查询)。因此,ID保持其默认值,整数为零。你不应该手动给出价值。将实体插入数据库后,上下文将接收ID值并更新实体。

更新:当您将条形码添加到现有产品时,EF足够聪明,可以更新实体的密钥和外键:

var product = db.Products.First(); // some product from database
var barcode = new Barcode { BarcodeText = "000" }; 
// at this point barcode.ID and barcode.ProductID are zeros
product.Barcodes.Add(barcode);
db.SaveChanges(); // execute insert query
// at this point both PK and FK properties will be updated by EF
相关问题