实体框架中的单例数据库模式

时间:2009-06-16 23:52:06

标签: entity-framework

我有一个应用程序,我在数据库中实现单例模式,我遇到了很多问题。

我有以下表,SingletonTable

+-------------+-------+------------+
| Column Name | Type  | Allow Null |
+-------------+-------+------------+
| Id          | Int   |  No        |
| VarType     | Int   |  No        |
| TypeARef    | Int   |  Yes       |
| TypeBRef    | Int   |  Yes       | 
+-------------+-------+------------+

在EF中,它分为两种具体类型:TypeA和TypeB。 TypeARef在TypeA上,TypeBRef在TypeB上,VarType是鉴别器。 (VariableType,TypeARef,TypeBRef)上有一个唯一索引。单例模式的想法是我们在数据库中只有一行给定值元组,所以每当我们添加对SingletonTable的引用时,我们首先检查该行是否存在,如果存在,我们返回数据库中的行,如果没有,我们创建行并返回对新创建的行的引用。我把它抽象成了一个方法GetSingleton。

问题是每当我使用GetSingleton方法时,我都会遇到以下异常:

测试方法UnitTests.CreateBasicData.CreateFTIData抛出异常:System.InvalidOperationException:无法将对象添加到EntityCollection或EntityReference。附加到ObjectContext的对象无法添加到与源对象无关的EntityCollection或EntityReference

我正在使用它

var newRow = new SomeType
{
        singletonValue = GetSingleton(new TypeB{ TypeBRef = Foo })
}

问题似乎是我无法将数据上下文中尚未存在的引用添加到数据上下文中的引用。这是正确的吗?我如何解决这个限制?

谢谢, 罗伊

1 个答案:

答案 0 :(得分:3)

在Entity Framework中的对象上下文中执行查询时,返回的对象将自动附加到对象上下文。

您还可以将对象附加到从查询以外的源获取的对象上下文。您可以附加先前已分离的对象,NoTracking查询返回的对象或已在对象上下文之外获取的对象。您还可以附加已存储在ASP.NET应用程序的视图状态中或已从远程方法调用或Web服务返回的对象。

使用以下方法之一将对象附加到对象上下文:

  • 在ObjectContext上调用AddObject以将对象添加到对象 上下文。当对象是尚未存在的新对象时执行此操作 存在于数据源中。

  • 在ObjectContext上调用Attach以将对象附加到对象 上下文。当对象已存在于数据源中时执行此操作 但目前并未附加到上下文中。欲获得更多信息, 请参阅如何:附加相关对象(实体框架)。

  • 在ObjectContext上调用AttachTo以将对象附加到特定对象 在对象上下文中设置的实体。如果对象有一个,也可以这样做 null(在Visual Basic中没有任何内容)EntityKey值。

http://msdn.microsoft.com/en-us/library/bb896271.aspx