开发者

EF 4.0 generics based inheritance

I have a class like this

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

then many derived classes like

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

is it possible to map this hierarchy using EF 4.0 using Table per inheritance scheme ? Currently the generated code creates has an error because it generates a property like

public <T> ObjectSet<TypedAttribute<T>> TypedAttributes
{
     get 
     { 
        return _typedAttributes  ?? (_typedAttributes = CreateObjectSet&开发者_JS百科lt;TypedAttribute<T>>("TypedAttributes")); }
     }
private ObjectSet<TypedAttribute> _typedAttributes;


I don't think so because:

  • Inheritance mapping requires the base class to be entity in EDMX.
  • When inheritance is used the ObjectSet is for base type. What generic argument would you use to create an instance of ObjectSet when it has to be used to retrieve any subtype?

It can be partially achieved without inheritance (at least for POCOs). Simply model your subtypes in EDMX without base type. Then manually create POCO classes and derive them from generic base types. The only rule you have to follow is that POCO class must have the same name as entity in EDMX and it must have all its properties with accessibility set in EDMX. If you want to use change tracking properties must be marked as virtual. If you want to use lazy loading navigation properties must be virtual as well.

Example:

Suppose that I have two entities in EDMX: IntegerValue and DoubleValue. Now I defined these POCOs as follows:

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>
{ }

It will result in single table per sub type.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜