2012-10-17 52 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的目的而对混合/抽象形式的继承进行说明。 –