我有两个简单的数据库表:
人(身份证,姓名,住宅)
房屋(id,街道,城市)
Persons表的“house”列是指定一个人住在哪个房子的外键。简单的例子。 我从数据库创建了一个模型,现在我正在尝试学习如何使用EF。 我试图将断开连接的实体附加到现有上下文:
House dh = new House() { city = "Seattle", street = "St Road 1" };
dh.Persons = new List<Person>();
dh.Persons.Add(new Person { namen = "Andrew" });
dh.Persons.Add(new Person { namen = "Thorsten" });
YardEntities cx = new YardEntities();
cx.Houses.Attach(dh);
最后一行引发了一个我不明白的例外:
附加信息:附加类型的实体 'DataAccessLayer.Person'因为另一个实体而失败了 type已经具有相同的主键值。
为什么?安迪的想法?主键'id'具有自动增量,是我表的主键。
编辑:
我的两个实体类的代码:
public partial class Person
{
public int id { get; set; }
public string namen { get; set; }
public int house { get; set; }
public virtual House House1 { get; set; }
}
public partial class House
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public House()
{
this.Persons = new HashSet<Person>();
}
public int id { get; set; }
public string street { get; set; }
public string city { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Person> Persons { get; set; }
}
答案 0 :(得分:0)
在您的情况下,我建议您测试DatabaseFirst
上下文的第二个解决方案。
这似乎是Primary Key
和实体框架定义的问题。
要解决duplicate key
的问题,这是因为它没有定义为identity
(自动增量)=&gt;您的代码显示您在添加新Id
或Person
时未定义House
。
对于DatabaseFirst
上下文,您可以选择解决方案:
Id
列Identity
。您可以像这样定义Id
属性:
House dh = new House() { Id = 1, city = "Seattle", street = "St Road 1" };
dh.Persons.Add(new Person { Id = 1, namen = "Andrew" });
dh.Persons.Add(new Person { Id = 2, namen = "Thorsten" });
对于CodeFirst
上下文,您有以下2个解决方案:
CodeFluent
解决方案:
modelBuilder
.Entity<Person>()
.Property(f => f.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
DataAttribute
解决方案:
public class Person
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id{ get; set; }
// ...
}