3

在我的asp應用程序中,我想使用Ruby on Rails的實體框架中的Active記錄中的Polymorphic association。 我知道在StackOverflow討論這個問題時已經有了一些話題,但是我想在不使用繼承的情況下實現它,因爲它可以在rails上運行ruby,所以我想問一下它是否可行。實體框架中來自Ruby on Rails的多態關聯等效

謝謝。

+0

「我想在不使用繼承的情況下實現它,因爲它可以在rails上運行」 - 您是什麼意思?目前尚不清楚。 – 2014-03-26 02:16:58

回答

2

Ruby on Rails的通過定義類型柱實現這種模式。由於它在鏈接說你引用:

爲了使這項工作,你需要同時聲明一個外鍵列,並在模型中聲明的多態接口

在一個規範的一個類型列關係數據庫,這永遠不能作爲外鍵約束實現,因爲一個外鍵字段只能引用一個主鍵字段。因此RoR中的多態關聯可能僅僅被實現爲「軟」外鍵。

這就是爲什麼在EF中完全不能像在RoR中那樣完成這個操作的原因。與外鍵相同,關聯只能引用另一個實體。但是,您可以創建繼承的類,每個類都可以引用它們自己的實體。這就是爲什麼當這些關聯用EF實現時你只能找到繼承的例子。另一個例子是我的問題here

+0

謝謝@Gert作爲你的回答,我認爲我們就像你說的,但我想嘗試一下。在我的情況下,我無法創建繼承類,因爲這兩個現有的類沒有共同之處或者只是一點點,並且繼承的引入會打破我的應用程序的其他部分,所以我可能會通過兩個可選的外部鍵,而其中一個將爲空,另一個將指向對象,反之亦然 –

-1

我認爲這是你正在尋找的:Entity Framework Polymorphic associations。這個例子使用接口而不是繼承。希望能幫助到你。

+0

謝謝你的回答,但我已經看到了這一點,它並不完全是這條軌道上的活動記錄。 rails中的活動記錄可以讓你在沒有任何超類或接口的情況下進行多態關聯(所以你不必定義這兩種類型之間的任何關係)。你只需創建包含對象id和對象字符串表示形式的名稱的記錄,這就是所有,所以我正在尋找類似於這樣的東西 –

2

我有很多使用實體框架做適當的多態關聯(即由接口定義的關聯,而不是抽象類型)的經驗。我認爲這種模式對於良好的對象建模是必不可少的,而且我已經多次指責EF開發團隊缺乏對這種可以很容易地添加的模式的本地支持,IMO。 (原生支持包括能夠在LINQ to Entites中查詢這些關聯,就像在LINQ To Objects中一樣)。

在我的實現中,你必須保存一個'複合鍵',它定義了關聯對象的類型和標識 - 我相信這是它在Hibernate和RoR中的完成方式。通過讀取這個鍵然後動態地創建一個訪問相應類型實例的方法,在代碼中完成關係的導航。

雖然您無法將此複合鍵設置爲FK,但您可以使用'兩半模式表'更加努力地添加參考完整性。我已經在「裸體對象開發」手冊中詳細描述了這些內容,您可以在Git Hub上查找這些手冊。然而,這些模式並不依賴於裸體對象框架,您可以複製它們。所有源都在那裏(請參閱NakedObjects.Helpers中的PolymorphicNavigator類)。

0

除了@ richard-pawson的回答,我已經從實體框架移植到了Java(JDO/DataNucleus)的「兩半桌面」模式,並在github上提供了一個完整的示例。

你應該可以使用它在.NET環境中找到類似的東西。