实体框架4.1代码优先并插入新的一对多关系

问题描述

|| 我在将新对象图与一对多关系保持在上下文中时遇到麻烦。我正在使用Entity Framework 4.1版本,并实现了“代码优先”方法。我正在使用现有的sql 2008数据库,并实现了从DbContext派生的上下文。我有两个类,人和地址。一个人可以包含0个或更多这样定义的地址。
public class Person 
    {
        public Person()
        {
            Addresses = new List<Address>();
        }

        public int PersonId { get; set; }
        ***Additional Primitive Properties***

        public virtual ICollection<Address> Addresses { get; set; }

    }

public class Address 
    {
        public int AddressId { get; set; }
        public int AddresstypeId { get; set; }
        ***Additional Primitive Properties***

        public int PersonId { get; set; }
        public virtual Person Person { get; set; }
    }
我正在尝试创建一个具有两个地址的Person的新实例。但是,当我将此结构添加到上下文并保存时,仅持久保存集合中的第一个地址。第二个将“个人”导航属性设置为null,并且不与“个人”对象关联,但是,列表中的第一个关联。
var person = new Person();

var mailingAddress = new Address() { AddresstypeId = 1 };
person.Addresses.Add(mailingAddress);

var billingAddress = new Address() { AddresstypeId = 2 };
person.Addresses.Add(billingAddress);

context.People.Add(entity);
context.SaveChanges();
它不会引发异常,但是不会保存Address集合中的第二项。 有人对为什么只有第一个被保存有什么好主意吗?谢谢。     

解决方法

        经过数小时的故障排除/尝试和错误,我已经解决了我的问题。 我的POCO类还用于不连贯的环境中 这些对象将从上下文中分离出来,进行修改,然后重新附加。 为了确定哪些导航属性收集项受到影响,我覆盖了 Address类中的Equals和GetHashCode方法确定是否相等。显然,这会影响EF 4.1插入导航属性对象的完整集合的能力??? 这是导致此问题的原始相等方法:
public override bool Equals(object obj)
{
    Address address = obj as Address;
    if (address == null) return false;
    return address.AddressId == this.AddressId;
}

public override int GetHashCode()
{
    return this.AddressId.GetHashCode();
}
为了纠正问题,我创建了一个自定义相等比较器 导航对象,而不是直接将其包含在地址类中。
public class AddressEqualityComparer : IEqualityComparer<Address>
{
    public bool Equals(Address address1,Address address2)
    {
        if (address1.AddressId == address2.AddressId)
            return true;
        else
            return false;
    }

    public int GetHashCode(Address address)
    {
        return address.AddressId.GetHashCode();
    }
}
进行此更改后,我的context.People.Add方法调用按预期工作。 如果有人知道为什么重写类中的相等方法会导致 EF 4.1仅将第一个项目插入集合中,即 很好的信息。     ,        如前所述,这是因为GetHashCode方法正在使用所有同级的ID,在实体框架进行比较时将为0。只需评论一下,您就可以开始了。 我遇到了同样的问题,这一点让我明白了。我什至没有去看我的EntityBase代码...它是如此之旧,直到现在一直都没有改变。 非常感谢您的研究!     ,        这是尝试添加代码的另一种方法。值得一试。此代码可能不准确,我输入了徒手。
var person = new Person();

person.Addresses.Add(new Address()
{
   AddressTypeId = 1
}),new Address()
{
   AddressTypeId = 2
});

context.People.Add(entity);
context.SaveChanges();