我有这样一个类
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/