2012-10-17 170 views
0

我有一組字段,我打算在多個模型之間共享。我希望所有的字段都包含在每個實體的表格中(不只是一個表格的字段)。我更熟悉諸如Python這樣的語言,這種類型的模式被稱爲「混入」,本質上是一個本身不存在的類(它不會被實例化/沒有表中的表)模型類的情況)。相反,派生類只是繼承這些字段,並且它的表看起來好像這些字段僅僅包含在模型類中。ASP.NET MVC模型Mixins?

實體框架中的「複雜類型」的概念看起來像是我正在尋找的代理的密切代理,但無法包含導航屬性有點殺手鐗。有沒有其他的方式來做到這一點,或者如果複雜類型是答案,那麼我應該如何處理導航屬性?

回答

0

實際上有機會與Entity Framework上的開發人員討論此問題。目前這在技術上不可行。它顯然正在被踢,但目前沒有人正在做這件事。複雜類型是一種排序版本,但它們當然不支持導航屬性。感謝所有爲我刺殺過它的人。

+0

相關鏈接:http://entityframework.codeplex.com/discussions/401339 –

1

我已經仔細閱讀本說明在一本書:

一個有趣的可能性超出了基類和接口是混入,但他們不是通過.NET語言支持的面向對象的特性。 mixin是一個提供其他類可以繼承的特定功能的類,但它並不意味着它是一個獨立的類。換句話說,mixin就像一個接口,其中一些成員可能包含預定義的實現。 Mixins支持一些動態語言,包括Python和Ruby。目前沒有.NET語言支持mixin,但可以使用Castle等特別框架模擬mixin。 DynamicProxy。有了這個框架,你首先定義一個包含你想要在現有類中注入的所有方法的類 - mixin。接下來,您使用該框架爲包含注入方法的給定類創建代理。 Castle.DynamicProxy在內部使用Reflection.Emit來實現這一訣竅。

+0

對不起,但TPT幾乎是我不想要的。我不希望「mixin」擁有自己的表格。基本上,我只是尋找一種方法來添加一組通用字段到其他模型,而不需要將該組複製並粘貼到每個模型。它們會繼承基類(和coure抽象)類的字段,但是它們會將它視爲直接在派生類上直接定義字段。主要問題涉及以Entity Framework可以理解的方式進行此操作。 –

+0

好的,你可以在這個鏈接閱讀關於C#中的mixins:http://stackoverflow.com/questions/255553/is-it-possible-to-implement-mixins-in-c ,我會編輯我的答案爲儘快我得到關於它的更多信息:) –

1

你可以使用繼承來做到這一點。如果你已經考慮過了,我很抱歉。代碼如下。

public abstract class WidgetBase 
{ 
    public string Name { get; set; } 
} 

public class SweetWidget : WidgetBase 
{ 
    public int SweetnessFactor { get; set; } 
} 

public class SourWidget : WidgetBase 
{ 
    public int Sourness { get; set; } 
} 

然後在你的車型配置,你這樣做:

const string discriminator = "WidgetType"; 
Map<SweetWidget>(mc => mc.Requires(discriminator).HasValue("Sweet")); 
Map<SourWidget>(mc => mc.Requires(discriminator).HasValue("Sour")); 

您需要添加一列, 「WidgetType」,你的表。 EF將按照映射中指定的方式填充它。

請注意,基類必須是抽象的。只要你的表包含所有派生類的所有字段,這就是你如何在EF Code First中執行Table Per Hierarchy。

+0

是的,很抱歉,顯然,我對這個問題非常困難。其實我已經在其他地方實施了TPH。我在這裏尋找的基本上就是DRY。就應用程序和數據庫而言,在您的示例中只會有Sweet and Sour。他們每個人都有一個「姓名」字段,但就是這樣。除了添加「名稱」字段外,「WidgetBase」不會用於其他目的。它不會有表格,除了Sweet and Sour繼承它之外,我絕對不會在代碼的其他任何地方使用它。 –

+0

這是值得的。我正在尋找的是更接近於TPC(Table-Per-Concrete Type)的表達式,儘管這需要太多的接線代碼才能在長期運行中實現它,或者Entity Framework的ComplexType。問題是,無論使用哪種方法,我都不能包含導航屬性。也許,這是不可能的,但我很難相信任何現代MVC框架都不會僅僅爲了DRY的目的而對混合/抽象形式的繼承進行說明。 –