为什么Entity Framework会覆盖我的主键,然后抛出主键违例异常

时间:2017-11-30 17:08:21

标签: c# entity-framework

我在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]

关联的实体密钥只是一个不可为空的Guid: enter image description here

谢谢, 史蒂夫

0 个答案:

没有答案