Функциональность метода отсоединения Entity Framework ObjectSet - PullRequest
0 голосов
/ 23 марта 2010

Ну, во-первых, я объясню всю ситуацию.У меня есть простая модель домена 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 я восстановил EDMX с включением FK.Так что теперь часть моего тестового кода больше не работает.Проблема связана с методом отсоединения ObjectSet (репозиторий 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 пустое, более того, оно пустое (я проверил базу данных - Customer был успешно сохранен).Таким образом, последнее утверждение не выполняется.Этот код работал довольно хорошо, пока я не добавил свойство FK.Так есть ли объяснение этому поведению?

1 Ответ

0 голосов
/ 25 марта 2010

Предполагается, что он был успешно сохранен в БД (поэтому отношения между клиентом и компанией существуют в БД)

Проблема заключается в том, что вы не загрузили ссылку на Клиентов.Так что либо:

A) Включите клиентов, когда вы извлекаете компанию из контекста, либо

B) Lazy Загрузите ее, прежде чем проверять ссылку.

...