2

それ自体のコレクションと、ルートウィジェットの場合は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; }

}

は実際には単なる基本クラスであるため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
{

}

どうすれば自分が求めていることを達成できますか

4

1 に答える 1

2

階層を定義するプロパティを保持する基本クラスのマップを定義しようとしましたか?

例えば:

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 は、上記の方法で目的が達成されない場合に役立つ基本クラスのプロパティを考慮していません。

于 2013-07-16T09:06:07.823 に答える