c# - 基于 EF 4.0 泛型的继承

标签 c# entity-framework entity-framework-4

我有这样一个类

public abstract class BaseType<T>
{
  public string Name {};
  public T TypedValue { 
    get {
       return GetTypedValue(PersistedValue);
        }  
  };
  public string PersistedValue {} 
  public abstract T GetTypedValue(PersistedValue);
}

然后很多派生类比如

public class IntegerType:BaseType<int>
{
 ...
}

是否可以使用 EF 4.0 使用每个继承方案的表来映射此层次结构? 目前生成的代码创建有一个错误,因为它生成了一个属性,如

public <T> ObjectSet<TypedAttribute<T>> TypedAttributes
{
     get 
     { 
        return _typedAttributes  ?? (_typedAttributes = CreateObjectSet<TypedAttribute<T>>("TypedAttributes")); }
     }
private ObjectSet<TypedAttribute> _typedAttributes;

最佳答案

我不这么认为,因为:

  • 继承映射要求基类是 EDMX 中的实体。
  • 当使用继承时,ObjectSet 用于基本类型。当必须使用它来检索任何子类型时,您会使用什么通用参数来创建 ObjectSet 的实例?

它可以在没有继承的情况下部分实现(至少对于 POCO)。只需在没有基本类型的 EDMX 中为您的子类型建模。然后手动创建 POCO 类并从泛型基类型派生它们。您必须遵循的唯一规则是 POCO 类必须与 EDMX 中的实体同名,并且它的所有属性都必须在 EDMX 中设置可访问性。如果要使用更改跟踪属性必须标记为虚拟的。如果要使用延迟加载,导航属性也必须是虚拟的。

例子:

假设我在 EDMX 中有两个实体:IntegerValue 和 DoubleValue。现在我将这些 POCO 定义如下:

public abstract class BaseType<T>
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual T Value { get; set; }
}

public class IntegerValue : BaseType<int>
{ }

public class DoubleValue : BaseType<double>
{ }

这将导致每个子类型只有一个表。

关于c# - 基于 EF 4.0 泛型的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5300776/

相关文章:

entity-framework - 存储过程返回错误的标量值-1,而不是返回值

entity-framework - 由于对象的当前状态,操作无效

c# - ASP.NET MVC 传递数据

c# - XPath:根据另一个节点选择一个节点?

c# - 在 WPF 中向 DataGridTextColumn 添加填充

c# - 我可以使用 foreach 只返回集合中的特定类型吗?

c# - 将硬编码的 JSON 字符串存储到变量

c# - 错误 CS1061 : 'DbSet<T>' does not contain a definition for 'FromSql' and no extension method 'FromSql' accepting a first argument of type 'DbSet<T>'

c# - ASP.NET C# Entity Framework - 如何正确更新外键?

c# - 通过 UpdateAsync 方法从移动服务接收千兆数据