实体框架ObjectSet分离方法功能

时间:2010-03-23 06:24:02

标签: c# .net entity-framework entity-relationship

嗯,首先我会解释整个情况。我有简单的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属性之前,此代码运行良好。那么这种行为有什么解释吗?

1 个答案:

答案 0 :(得分:0)

假设它已成功保存到数据库(因此客户/公司关系存在于数据库中)

问题在于您没有加载对Customers的引用。所以:

A)从上下文中检索公司时包括客户,或

B)懒惰在检查参考之前加载它。