0

いくつかの既存のクラスとカスタム XML マッピング ファイルを操作するデータ モデルを動的に作成したいと考えています。これは、既存のテーブルが多数あり、既存のビジネス クラスが多数あるためです (クレイジーかもしれませんが、わかりません)。

異なる列名を使用するか、既存の列に対応しないプロパティについては、.Ignore() と .HasColumnName() を呼び出したいのですが、動的に実行したいと考えています。

したがって、このような呼び出しを行うことができるようにしたいのですが、リフレクションと Linq.Expressions を使用した XML 構成ファイルに基づいて動的に呼び出しを行いたいです (これは使用する機会がありませんでした)。

modelBuilder.Entity<Product>().Property(p => p.QuantityInStock).HasColumnName("UnitsInStock");

また

modelBuilder.Entity<Product>().Ignore(p => p.QuantityInStock);

これが私が試みていることです (最終的には、XML マップを参照して、マップするプロパティと無視するプロパティを決定します)。

Type entityType = typeof(Product);

var config = modelBuilder.GetType().GetMethod("Entity")
    .MakeGenericMethod(entityType)
    .Invoke(modelBuilder, null);

var ignore = config.GetType().GetMethod("Ignore").MakeGenericMethod(entityType);

var paramEx = Expression.Parameter(entityType);
var lambdaEx = Expression.Lambda(Expression.Property(paramEx, "QuantityInStock"), paramEx);

ignore.Invoke(config, new[] { lambdaEx });

しかし、私のラムダ式は正しくありません:

Object of type 'System.Linq.Expressions.Expression`1[System.Func`2[ConsoleApplication2.Product,System.Int16]]' 
cannot be converted to type 
'System.Linq.Expressions.Expression`1[System.Func`2[ConsoleApplication2.Product,ConsoleApplication2.Product]]'.
4

2 に答える 2

1

メソッドのジェネリック型引数が間違っていIgnoreます。コードを次のように変更します。

var paramEx = Expression.Parameter(entityType);
var prop = Expression.Property(paramEx, "QuantityInStock");
var lambdaEx = Expression.Lambda(prop, paramEx);
var ignore = config.GetType().GetMethod("Ignore").MakeGenericMethod(prop.Type);

編集: 呼び出しHasColumnName:

var property = config.GetType().GetMethod("Property", new Type[] { lambdaEx.GetType() });
var hasColumnName = property.ReturnType.GetMethod("HasColumnName");

hasColumnName.Invoke(
    property.Invoke(config, new[] { lambdaEx }),
    new[] { "UnitsInStock" });

longただし、これは のような オーバーロード リストから除外された構造体では機能しません。これらの場合propertyの値は になりますnullPropertyしたがって、ジェネリックメソッドを検索してGetMethods、適切なメソッドを選択する必要があります (パラメーターのNullable<T>型の有無にかかわらず)。Expression

于 2012-03-19T16:38:43.657 に答える
0

IMO これは Fluent API の本来の目的ではありません。Fluent API の全体的な目的は、コンパイル時の安全性を確保しながら、より読みやすく簡単な構成方法を提供することです。このアプローチでは、それがないように見えます。

構成を外部化するより良い方法は、EntityTypeConfigurationクラスを使用して、これらを に追加することModelBuilderです。

于 2012-03-19T15:49:21.733 に答える