现在我完全不明白持久性无知如何应用于实体框架。我使用实体框架设计了一个经典的存储库和工作单元。
现在,想象一个简单的客户端场景,我需要读取一些对象列表,然后保存其中一个。我的实体包含一些对象图,例如,Person 实体包含 Address 复杂属性,其中 Addrress 是另一个实体,也是一个 Hobby 对象列表,它也是另一个实体。我的客户:
var personList = PersonRepository.GetAll();
PersonRepository.Dispose(); // it will dispose EF's ObjectContext
var person = personList[0];
person.Address.City = "...";
person.Hobby.Remove(person.Hobby.First());
PersonRepository.SaveChanges(person);
正如你所看到的,我已经保持了持久性无知逻辑,我仅限于使用 person 对象及其边界,但是,在现实世界中,上面的代码片段将倾向于失败,因为我已经处理了分离对象工作单位。
所以,我考虑过使用一些实体包装器和一些方法,比如 ManageGraph(object obj, ObjectState state),以便在内部字典中保留所有更改的关系的任何其他更改。但是,我不喜欢这个解决方案,它看起来太脏了,看起来像 anty 模式:
person.Name = "some name";
person.ManageGraph(AddressObject, state.Modified);
rather then
person.ManageGraph(AddressObject, state.Added);
但是……执着的无知在哪里?为什么我要强制使用坏技巧来获得正确的工作?持久性无知意味着我必须在没有任何其他东西的情况下处理简单对象,所以它会像下面这样:
person.SomeProperty = SomeValue
person.ComplexProperty.OtherProperty = otherValue
person.ListOfComplexProperty.Add(new entity);
当然,我知道,我不想要神奇的解决方案,它不存在,但是,是否有一些好的解决方案或建议可以获得最好的工作?