我有一个具有虚拟属性的基类。基类的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?请记住,父插入将发生在非相关的函数执行中。