con*_*nnr 8 entity-framework-4.1
我无法通过一对多关系将新对象图表存储到上下文中.我正在使用Entity Framework 4.1发行版,并实现Code-First方法.我正在使用现有的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; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用两个地址创建一个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();
Run Code Online (Sandbox Code Playgroud)
它不会抛出异常,但是地址集合中的第二项不会被保存.
有没有人对为什么只保存第一个有什么好主意?谢谢.
con*_*nnr 10
经过数小时的故障排除/反复试验,我已经解决了我的问题.我的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();
}
Run Code Online (Sandbox Code Playgroud)
为了纠正这个问题,我为导航对象创建了一个自定义相等比较器,而不是直接将它包含在地址类中.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的context.People.Add方法调用在我做出此更改后按预期工作.
如果有人知道为什么覆盖类中的相等方法会导致EF 4.1只插入集合中的第一个项目,那将是很好的信息.
| 归档时间: |
|
| 查看次数: |
5001 次 |
| 最近记录: |