我在Entity Framework中遇到了一些奇怪的行为。我循环遍历一个非实体"子组件"对象并将它们插入我的数据库。在检索并验证父组件实体存在之后,我实例化一个新的SubComponent实体,将新Guid分配给主键字段,将其连接到父组件实体,然后将其添加到SubComponent实体集并保存更改。
我在我的代码中的其他地方使用过此模式而没有问题。但是,这一次,当我调用db.SaveChanges()时,它会抛出一个主键违例异常,抱怨数据库中已存在具有该键的实体。这对我来说很困惑,因为我刚为每个SubComponent创建并分配了一个新的Guid。当我单步执行代码时,我发现新的Guid确实是在{obj.id = id}创建和分配的。在代码执行{db.SubComponents.Add(obj)}之后,我发现{obj.id}已经以某种方式重置为之前插入的其他SubComponent实体之一的id,这当然会导致{db .SaveChanges()}抛出指示主键冲突的异常。
foreach (var sub in list)
{
using (var db = new MyEntities())
{
//try to retrieve the subcomponent's parent component
var comp = (from c in db.Components
where c.Equipment_ID == sub.EquipmentId && c.ComponentName == sub.ComponentName
select c).FirstOrDefault();
if (comp != null) //a check to make sure the parent Component exists to avoid a foreign key violation
{
Guid id = Guid.NewGuid();
SubComponent obj = new SubComponent();
obj.id = id;
obj.Component = comp; //connect the new SubComponent to it's parent Component entity
//assign a bunch of other junk here
obj.Size = sub.Size;
obj.Weight = sub.Weight;
//etc...
db.SubComponents.Add(obj); //for some reason this sometimes overwrites obj.id with the id of a SubComponent that had been added earlier
db.SaveChanges();
}
}
}
所以问题是,实体框架为什么/如何覆盖我在新实体被添加到SubComponent实体集时分配给我的新实体的id?有没有其他人经历过这种奇怪的行为?
主键非常简单。在数据库中,它只是一个没有任何默认约束的uniqueidentifier字段。
CONSTRAINT [PK_SubComponent] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
谢谢, 史蒂夫