0

これがセットアップです

名前空間 DAL と名前空間 DTO があります (別のアセンブリ内)。どちらも Foo クラスを含んでいます。私がやろうとしていたのは、DTO 型で EF インクルードを指定し、それらを DAL 型に変換することです。

フロントエンドからの次のコレクションがあります。

using DTO;

public class GetFooById : Request
{
    public GetFooById()
    {
        IncludeProperties = new HashSet<Expression<Func<object, object>>>
                    {
                        x  => ((Foo)x).Bar, //DTO.Foo, when debugging is DAL.Foo
                        x => ((Foo)x).Foobars,
                    };
    }
}

このコレクションを次のような別のアセンブリで使用します。

IQueryable<object> query = Context.Foos;

foreach (var expr in request.IncludeProperties)
{
        query = query.Include(expr);
}

var foo = query.First(x => x.Id == request.Id);

奇妙なことに、このコードはコンパイルおよび実行されていますが、含まれているプロパティは null です。デバッグ中にこの部分にカーソルを合わせると:x => ((Foo)x).BarデバッガーはFoo、含まれている DTO.Foo ではなく、タイプが DAL.Foo であると表示します。

これは、DTO へのインクルードがなく、DAL へのインクルードがあるファイルに式がコンパイルされているためですか? これは c# のバグではありませんか?

これは C# で予想される動作ですか?

プロジェクト フレームワークは 4.0 ですが、4.5 をインストールしてコンパイルしています。

4

2 に答える 2

1

これは C# が原因ではありません。の結果を無視しているquery.Include(expr);ため、Include式は実際には適用されません。未使用のままである限り、問題を引き起こすことはありません。通常の C# コード (式ツリーを使用しない) でも、 type のオブジェクトを取得した場合A、それを完全に異なる型にキャストすることB(B)(object)a明らかに機能しませんが、これはコードが実際に呼び出された場合にのみ実行時に検出されます。

また、私の知る限り、Entity Framework は現在、同じ名前の複数の型をサポートしていません。名前でタイプを検索し、同じ名前DAL.Fooを持っています。DTO.FooEF が認識している型は、EF が最終的に使用する型です。これに頼るべきではありません。

于 2013-08-20T09:02:31.203 に答える