2013-07-15 15 views
2

我有它有其自身的集合,并且我想成为空父母财产,如果它是根插件的下列实体:EF 6流利的配置 - 递归嵌套对象与母公司 - TPH

public class CanvasWidgetQuery 
{ 
    public int CanvasWidgetId { get; set; } 

    public int? ParentCanvasWidgetId { get; set; } 
    public virtual CanvasWidgetQuery ParentCanvasWidget { get; set; } 
    public virtual ICollection<CanvasWidgetQuery> InnerCanvasWidgets { get; set; } 

} 

因为CanvasWidgetQuery实际上只是一个基类(可能是抽象的,但我没有抽象,直到我看到它没有它时才起作用)。我想创建一个通用的映射配置映射派生类型的CanvasWidgetQuery

public class CanvasWidgetQueryMap<TCanvasWidgetQuery> : EntityTypeConfiguration<TCanvasWidgetQuery> 
    where TCanvasWidgetQuery : CanvasWidgetQuery 
{ 
    public CanvasWidgetQueryMap() 
    { 
     this.HasKey(q => q.CanvasWidgetId); 

     this.HasMany(w => w.InnerCanvasWidgets) 
      .WithOptional(w => w.ParentCanvasWidget) 
      .HasForeignKey(w => w.ParentCanvasWidgetId); 

    } 
} 

无论派生类型,它们都具有这些属性,但不幸的是它抱怨的WithOptional调用(一次2个错误):

Error 1 Cannot implicitly convert type 'CanvasWidgetQuery' to 'TCanvasWidgetQuery'. An explicit conversion exists (are you missing a cast?) 


Error 2 Cannot convert lambda expression to delegate type 'System.Func<CanvasWidgetQuery,TCanvasWidgetQuery>' because some of the return types in the block are not implicitly convertible to the delegate return type 

如果我提出这样一个水平,以实际派生类型的映射:

public class SearchCanvasWidgetQueryMap : CanvasWidgetQueryMap<SearchCanvasWidgetQuery> 
{ 
    public SearchCanvasWidgetQueryMap() 
    { 
     this.HasMany(w => w.InnerCanvasWidgets) 
      .WithOptional(w => w.ParentCanvasWidget) 
      .HasForeignKey(w => w.ParentCanvasWidgetId); 
    } 
} 

现在抱怨说,它可以不含蓄转换成CanvasWidgetQuery同时SearchCanvasWidgetQuery

public class SearchCanvasWidgetQuery : CanvasWidgetQuery 
{ 

} 

我怎么能做到什么,我以后

回答

2

是你是否尝试过定义地图持有其定义层次结构的属性的基类?

e.g:

public class CanvasWidgetQueryMap<CanvasWidgetQuery> : EntityTypeConfiguration<CanvasWidgetQuery> 
{ 
    public CanvasWidgetQueryMap() 
    { 
     this.HasKey(q => q.CanvasWidgetId); 

     this.HasMany(w => w.InnerCanvasWidgets) 
      .WithOptional(w => w.ParentCanvasWidget) 
      .HasForeignKey(w => w.ParentCanvasWidgetId); 

    } 
} 

有一个在这里回答一些很好的附加信息:CTP 4 doesn't consider base class properties如果上面没有达到你以后可能会有所帮助。

+1

谢谢,这正是我最终的解决方法。但是我越多思考它越有意义,为什么EF中的继承不应该使用BaseEntityTypeConfiguration类在应用程序级建模,因为配置常见基本属性(如CanvasWidgetId)的方式基于继承策略(TPT,TPC,或TPH)而不是配置类的构造函数调用的顺序 – parliament

+1

有趣的一点是,这促使我去阅读更多关于EF继承策略的内容,因为我只需要在非常简单的情况下使用EF继承。 = d – Chris