Entity framework EF 6 Fluent配置-与父对象递归嵌套-TPH

Entity framework EF 6 Fluent配置-与父对象递归嵌套-TPH,entity-framework,ef-code-first,fluent-interface,Entity Framework,Ef Code First,Fluent Interface,我有以下实体,它有一个自身的集合和一个父属性,如果它是根小部件,我希望它为null: public class CanvasWidgetQuery { public int CanvasWidgetId { get; set; } public int? ParentCanvasWidgetId { get; set; } public virtual CanvasWidgetQuery ParentCanvasWidget { get; set; } publ

我有以下实体,它有一个自身的集合和一个父属性,如果它是根小部件,我希望它为null:

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

}
不管派生类型是什么,它们都具有这些属性,但不幸的是,它会抱怨
with optional
调用(一次两个错误):


我该如何完成我想要的

您是否尝试过为包含定义层次结构的属性的基类定义映射

e、 g:

公共类CanvasWidgetQueryMap:EntityTypeConfiguration
{
公共画布WidgetQueryMap()
{
this.HasKey(q=>q.CanvasWidgetId);
this.HasMany(w=>w.InnerCanvasWidgets)
.WithOptional(w=>w.ParentCanvasWidget)
.HasForeignKey(w=>w.ParentCanvasWidgetId);
}
}

这里的答案中有一些很好的补充信息:如果上述内容不能实现您的目标,可能会有所帮助。

谢谢,这正是我最终的解决方法。但是我想得越多,为什么EF中的继承不应该使用BaseEntityTypeConfiguration类在应用程序级别建模就越有意义,因为公共基属性(如CanvasWidgetId)的配置方式是基于继承策略的(TPT、TPC或TPH)这并不是配置类Interesting point的构造函数调用顺序,而是鼓励我更多地阅读EF继承策略,因为我只需要在相当简单的情况下使用EF继承=D
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);

    }
}
 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);
    }
}
public class SearchCanvasWidgetQuery : CanvasWidgetQuery
{

}
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);

    }
}