嗯,首先我会解释整个情况。我有简单的POCO域模型,我坚持使用EF 4.0。我第一次只使用导航属性而没有FK属性。但后来由于一些绑定目的,我决定将FK属性添加到我的模型中(下面的代码中的Company_ID)。以下是该模型中的两个类:
public class Company:EntityObject<Int32>, {
public virtual string Name { get; set; }
public virtual string Phone { get; set; }
public virtual string Fax { get; set; }
public virtual IList<Customer> Customers { get; set; }
}
public class Customer:EntityObject<Int32> {
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual Company Company { get; set; }
public virtual int Company_ID { get; set; }
}
我简化了这个模型只是为了突出主要问题。添加FK属性后,我重新生成了包含FK的EDMX。所以现在我的一些测试代码不再起作用了。问题在于ObjectSet的分离方法(Repository Detach是它的包装器)。这是测试代码:
using (IEntityModelContext context = new EFDataContext()) {
var compFact = context.GetFactory<Company>();
var custFact = context.GetFactory<Customer>();
Company comp = compFact.CreateObject();
comp.Fax = "111111";
comp.Name = "Testcomp";
comp.Phone = "222222";
context.CompanyRepository.Add(comp);
context.SaveChanges();
Customer cust = custFact.CreateObject();
cust.FirstName = "John";
cust.LastName = "Smith";
comp.Customers.Add(cust);
context.SaveChanges();
context.CompanyRepository.Detach(comp);
Company newComp = context.CompanyRepository.Load(com => com.Name == "Testcomp");
Assert.IsNotNull(newComp);
Assert.IsFalse(newComp.IsTransient);
Assert.AreEqual(comp.Fax, newComp.Fax);
Assert.AreEqual(industryList.Values[0], newComp.Industry);
Assert.AreEqual(comp.Name, newComp.Name);
Assert.AreEqual(comp.Phone, newComp.Phone);
Assert.AreEqual(sizeList.Values[0], newComp.Size);
Assert.AreEqual(1, newComp.Customers.Count);
加载newComp对象时问题会出现:Customers属性为空,而且它为null(我检查了数据库 - 客户已成功保存)。所以最后的断言失败了。在我添加FK属性之前,此代码运行良好。那么这种行为有什么解释吗?
答案 0 :(得分:0)
假设它已成功保存到数据库(因此客户/公司关系存在于数据库中)
问题在于您没有加载对Customers的引用。所以:
A)从上下文中检索公司时包括客户,或
B)懒惰在检查参考之前加载它。