0

我有一组我打算在多个模型之间共享的字段。我希望所有字段都包含在每个实体的表中(而不仅仅是一个字段表)。我更熟悉诸如 Python 之类的语言,其中这种类型的模式被称为“mixin”,本质上是一个自身不存在的类(它没有被实例化/在模型类的情况)。相反,派生类只是简单地继承了字段,并且它的表看起来好像字段被简单地包含在模型类中。

Entity Framework 中的“复杂类型”的概念似乎与我正在寻找的内容非常接近,但无法包含导航属性有点致命。有没有其他方法可以做到这一点,或者如果复杂类型是答案,那么我应该如何处理导航属性?

4

3 回答 3

1

我在一本书中读过这个注释:

除了基类和接口之外,一个有趣的可能性是 mixin,但它们是 .NET 语言不支持的 OOP 特性。mixin 是一个类,它提供了其他类可以继承的特定功能,但它并不意味着是一个独立的类。换句话说,mixin 就像一个接口,其中一些成员可能包含预定义的实现。一些动态语言支持 Mixin,包括 Python 和 Ruby。目前没有任何 .NET 语言支持 mixins,但可以使用诸如 Castle 之类的 ad hoc 框架来模拟 mixins。动态代理。使用此框架,您首先定义一个类,该类包含您要在现有类中注入的所有方法——mixin。接下来,您使用框架为包含注入方法的给定类创建代理。Castle.DynamicProxy 使用反射。

于 2012-10-17T06:27:14.817 回答
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 的方式。

于 2012-10-17T20:44:57.997 回答
0

实际上有机会与 Entity Framework 的一位开发人员讨论这个问题。目前在技术上是不可能的。它显然被踢了,但目前没有人在处理它。复杂类型是一种版本,但它们当然不支持导航属性。感谢所有为我努力的人。

于 2012-11-12T15:27:12.663 回答