2009-06-16 57 views
2

我有一個應用程序在數據庫中實現單例模式,並且遇到了很多問題。實體框架中的單例數據庫模式

我已經得到了下表,SingletonTable

+-------------+-------+------------+ 
| 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)上有一個唯一索引。單例模式的想法是我們在數據庫中只有一行給定值元組,所以無論何時我們添加對SingletonTable的引用,我們首先檢查該行是否存在,如果存在,我們返回如果沒有,我們創建該行並返回對新創建行的引用。我已經將這個抽象成一個方法GetSingleton。

的問題是每當我使用的方法GetSingleton,我得到的follwoing例外:

試驗方法UnitTests.CreateBasicData.CreateFTIData拋出異常:System.InvalidOperationException:對象不能被添加到EntityCollection或的EntityReference 。附接到一個ObjectContext的一個對象不能被添加到不與源對象相關聯的EntityCollection或的EntityReference

我使用它作爲這樣

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

這個問題似乎是我不能將尚未包含在數據上下文中的引用添加到數據上下文中的某個引用。這是正確的嗎?我如何解決這個限制?

謝謝, 羅伊

回答

3

當在實體框架對象上下文內執行一個查詢,返回的對象被自動附加到對象上下文。

您還可以將對象附加到從查詢以外的來源獲取的對象上下文。您可能附加先前分離的對象,NoTracking查詢返回的對象或在對象上下文之外獲取的對象。您還可以附加存儲在ASP.NET應用程序的視圖狀態中或從遠程方法調用或Web服務返回的對象。

使用以下方法給對象附加到對象上下文中的一個:

  • 上的ObjectContext呼叫ADDOBJECT對象添加到對象 上下文。當對象是數據源中尚不存在 的新對象時,請執行此操作。

  • 在ObjectContext上調用Attach將對象附加到對象 上下文中。當對象已經存在於數據源 中但目前未附加到上下文時,請執行此操作。有關更多信息,請參閱 請參閱如何:附加相關對象(實體框架)。

  • 在ObjectContext上調用AttachTo以將對象附加到在對象上下文中設置的特定 實體。如果對象具有 null(在Visual Basic中爲Nothing)EntityKey值,也請執行此操作。

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