这就是我所拥有的:
域名模型:
public class MyDomainEntity1
{
public string Name { get; set; }
public string Text { set; set; }
}
public class MyDomainEntity2
{
public Entity1 {get; set;}
public string Entity1Name {get; set;}
public string SomeIrrelevantProps {get; set;}
}
背景:
protected override OnModelBuilding(modelbuilder)
{
modelbuilder.Entity<MyDomainEntity1>().HasKey(x=> x.Name);
modelbuilder.Entity<MyDomainEntity2>().HasRequired(x=> x.Entity1).WithOptional().HasForeignKey(x=> x.Entity1Name);
}
种子代码:
context.Entities1DbSet.AddOrUpdate(x=>x.Name, new { Name = "ReferentialName1" });
context.Entities1DbSet.AddOrUpdate(x=>x.Name, new { Name = "ReferentialName2" });
context.SaveChanges(); // up to this point Working fine even when called several time.
context.Entities2DbSet.Add( new MyDomainEntity2 { Entity1 = new MyDomainEntity1 { Name = "ReferentialName1"}, Entity1Name = "ReferentialName1" });
context.SaveChanges() // throws the following exception :
违反PRIMARY KEY约束&#39; PK_dbo.MyDomainEntity1&#39;。无法在对象&#39; dbo.MyDomainEntity1&#39;中插入重复的密钥。重复键值为(ReferentialName1)。 声明已经终止。
由于某种原因,EF尝试添加新的MyDomainEntity1,而不是使用数据库中已存在的条目。到目前为止,我使用这种模式没有任何问题。似乎EF自动附加我添加的新实体,从而将它们链接到DB中已存在的行。
然而由于某种原因,它停止了工作,我收到了我现在的错误。我在我的域模型中经常使用这种模式来通过简单地实例化一个类来引用引用数据。我无法看到我改变了什么来打破它。
有什么想法吗?
请注意,调用DbSet.Attach()不是我的选择。 MyDomainEntity1的实例化通常在我的域模型项目中完成,我无法访问数据库。