EF和规范化的代码优先数据库重复主键

时间:2017-01-13 14:32:50

标签: c# sql entity-framework-6

我有一个具有虚拟属性的基类。基类的id列在插入时自动生成,而虚拟类具有Id,从另一个数据源检索(仍然保证唯一)。当将基础实体插入数据库两次时,我得到一个"主键违规异常"在属性上 - 意味着数据库试图重新插入相同的实体两次。

有没有办法告诉EF插入或更新虚拟财产实体,因为我希望将属性条目保持在最低限度,并且一旦创建它们就不会改变?

示例:

public class Parent {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public Guid Id {get;set;}

    public virtual Child Child {get; set;} 
}

public class Child {
    [Key]
    public Guid Id {get;set;} 
}

void Insert(){
    var c1 = new Child(){Id = Guid.NewGuid()};
    var c2 = new Child(){Id = c1.Id};
    var p1 = new Parent(){ Child = c1 };
    var p2 = new Parent(){ Child = c2 };
    db.Entries.Add(p1);
    db.SaveChanges();
    db.Entries.Add(p2); //Throws exception because of this
    db.SaveChanges(); 
}

请注意,这是一个示例,这些可以是两个不同函数的对象,只有相同的子ID。

更新:我想说我知道我可以创建一个新的Parent,从DB获取具有正确Id的任何Child并将其分配给Parent.Child,但在Parent中有相当多的属性,并且创建了不少父母 - 对于四个父对象,该过程大约需要2.5秒。太长了。

更新2:我将在此定义实际问题。有没有办法,没有明确地调用

c2 = db.Entries.FirstOrDefault(e=>e.Child.Id == c2.Id)?.Child

让EF搞清楚我想让p2.Child指向c1(当c1和c2当然有相同的PK)而不是试图重新插入c2?请记住,父插入将发生在非相关的函数执行中。

0 个答案:

没有答案