2012-03-19 49 views
1

我的问题很简单。我想用现有对象的引用来保存新创建的对象。现有对象在另一个上下文中加载并在会话期间存储。与此类似职位:Entity Framework Attaching a Persisted Object to the New ObjectEntitiyFramework4 - 参照现有实体保存新实体

我有这样的模式: EntityModel

当用户点击新建按钮一个新的工作表被创建并根据可用的定义(如模板)与部分和字段填充。此工作表存储在会话中并显示。用户可以输入字段的值并保存。 知道问题发生:

如果我只保存工作表,则整个对象图将保存为一个新对象。但是定义已经在数据库中 - > InvalidOperationException(“EntityKey属性只能在属性的当前值为空时设置”)。

表格当然不能附加,因为它只有一个临时/无效的EntityKey。

我尝试过的第三种解决方案:手动将定义附加到新的上下文,但附加会导致附加完整的对象图形,从而导致InvalidOperationException异常(“具有临时EntityKey值的对象无法附加到对象上下文。 )我检查了完整的图表,图中没有任何项目具有临时EntityKey。 (SectionDefinitions和FieldDefinitions)。看来Attach()也会尝试附加Section,Field和Sheet实例。

我只是想插入新的对象作为新的条目,并引用现有的定义。你有什么想法如何解决这个问题?

的测试解决方案在这里上传:http://www.coderline.net/AttachingTestSuite.zip

期待您的建议。

回答

2

当你最终保存工作表时,你应该创建一个新对象,并使用所需的id填充它,而不是对当前上下文未实现的对象的引用。

这很尴尬,但它是ORM的预期行为。实体框架是基于一些适合企业情况的惯例而设计的。它被设计用于加载对象树的多层操作,序列化不同图层,从该图层反序列化,附加到上下文并保存的多层操作。这意味着它预计在连接时在该树中具有同质对象。

+0

我从来没有在EntityFramework中看到过这种用法。是否有可能通过简单的ID定义引用对象(使用一些特殊的属性)?如果你有我的一些链接,我会非常感激。 – Danielku15 2012-03-19 12:08:54

+0

谢谢。我想我根据你的提示找到了解决方案。我创建了像这里描述的ForeignKeys:http://blogs.msdn.com/b/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx 之后,我能够创建我的工作表的深层克隆,它只使用ID来引用定义。谢谢。 – Danielku15 2012-03-19 12:45:31

+0

根据这些表格的更新,现在我有一个额外的问题。这是场景:我从数据库加载一个现有的工作表,并根据定义添加一个新的工作区到工作表。为了再次保存编辑后的表格,我需要附加实例。在那里我们又遇到了临时EntitiyKeys的问题。你有任何想法如何管理这种结构的编辑? – Danielku15 2012-03-23 17:40:00