我正在使用以下类将产品插入数据库。 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; }
}
答案 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