实体框架和DBContext附加操作

时间:2016-07-07 08:26:38

标签: .net entity-framework

我有两个简单的数据库表:

人(身份证,姓名,住宅)

房屋(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; }
}

1 个答案:

答案 0 :(得分:0)

在您的情况下,我建议您测试DatabaseFirst上下文的第二个解决方案。

这似乎是Primary Key和实体框架定义的问题。

要解决duplicate key的问题,这是因为它没有定义为identity(自动增量)=&gt;您的代码显示您在添加新IdPerson时未定义House

对于DatabaseFirst上下文,您可以选择解决方案:

  • 您修改表格以生成IdIdentity
  • 您可以像这样定义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; }
    
        // ...
    }