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

Entity framework 实体框架中的单例数据库模式,entity-framework,Entity Framework,我有一个在数据库中实现单例模式的应用程序,我遇到了巨大的问题 我有下表,单音表 +-------------+-------+------------+ | Column Name | Type | Allow Null | +-------------+-------+------------+ | Id | Int | No | | VarType | Int | No | | TypeARef | Int |

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

我有下表,单音表

+-------------+-------+------------+
| Column Name | Type  | Allow Null |
+-------------+-------+------------+
| Id          | Int   |  No        |
| VarType     | Int   |  No        |
| TypeARef    | Int   |  Yes       |
| TypeBRef    | Int   |  Yes       | 
+-------------+-------+------------+
在EF中,这被分解为两种具体类型,类型A和类型B。TypeARef在TypeA上,TypeBRef在TypeB上,VarType是鉴别器。上有一个唯一的索引(VariableType、TypeARef、TypeBRef)。singleton模式的思想是,对于给定的值元组,我们在数据库中只有一行,因此每当我们添加对SingletonTable的引用时,我们首先检查该行是否存在,如果存在,我们在DB中返回该行,如果不存在,我们创建该行并返回对新创建行的引用。我已经将其抽象为一个方法GetSingleton

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

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

我就是这么用的

var newRow = new SomeType
{
        singletonValue = GetSingleton(new TypeB{ TypeBRef = Foo })
}
问题似乎是我无法将数据上下文中不存在的引用添加到数据上下文中的引用。是这样吗?我如何克服这个限制

谢谢,
Roy

在实体框架的对象上下文中执行查询时,返回的对象将自动附加到对象上下文

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

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

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

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

  • 在ObjectContext上调用AttachTo将对象附加到特定的 对象上下文中的实体集。如果对象具有 null(在Visual Basic中为空)EntityKey值