Ну, во-первых, я объясню всю ситуацию.У меня есть простая модель домена 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.Так есть ли объяснение этому поведению?