gpt4 book ai didi

entity-framework-4.1 - Entity Framework 4.1 Code-First 和插入新的一对多关系

转载 作者:行者123 更新时间:2023-12-04 06:46:58 24 4
gpt4 key购买 nike

我无法通过一对多关系将新对象图持久化到上下文中。我正在使用 Entity Framework 4.1 版本,并实现代码优先方法。我正在使用现有的 SQL 2008 数据库并实现了从 DbContext 派生的上下文。我有两个类,Person 和 Address。一个人可以包含 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 实例。但是,当我将此结构添加到上下文并保存时,仅保留集合中的第一个地址。第二个将 Person 导航属性设置为 null,并且不与 Person 对象关联,但是,与列表中的第一个关联。
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 类(class)也在断开连接的环境中使用,其中
对象从上下文中分离,修改,然后重新附加。

为了确定哪些导航属性集合项受到影响,我覆盖了
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 只插入集合中的第一项,即
很棒的信息。

关于entity-framework-4.1 - Entity Framework 4.1 Code-First 和插入新的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com