我的问题很简单。我想保存一个新创建的对象,引用现有对象。现有对象在另一个上下文中加载并在会话期间存储。与此帖相似:Entity Framework Attaching a Persisted Object to the New Object
我有这个型号:
当用户点击新按钮时,将创建一个新工作表,并根据可用定义(如模板)填充部分和字段。此工作表存储在会话中并显示。用户可以输入字段的值并保存。 知道问题发生了:
如果我只是保存工作表,整个对象图将保存为新对象。但是这些定义已经存在于数据库中 - > InvalidOperationException(“只有在属性的当前值为null时才能设置EntityKey属性。”)
当然无法附加工作表,因为它只有一个临时/无效的EntityKey。
我尝试的第三个解决方案:手动将定义附加到新上下文但Attach会导致附加完整的对象图,这会导致InvalidOperationException(“具有临时EntityKey值的对象无法附加到对象上下文。”)我检查了完整的图表,图表中的所有项目都没有临时的EntityKey。 (SectionDefinitions和FieldDefinitions)。似乎Attach()也尝试附加Section,Field和Sheet实例。
我只是想将新对象作为新条目插入,以及要引用的现有定义。你对如何解决这个问题有任何想法吗?
测试解决方案在此处上传:http://www.coderline.net/AttachingTestSuite.zip
期待您的建议。
答案 0 :(得分:2)
当您最终保存工作表时,您应该创建一个新对象并使用所需的ID填充它,而不是对当前上下文未实现的对象的引用。
这很尴尬,但它是ORM的预期行为。实体框架是基于适合企业情况的一些约定而设计的。它被设计用于多层操作,其中加载了对象树,为不同的层序列化,从该层反序列化,附加到上下文并保存。这意味着它希望在连接时在该树中具有同类对象。