0

基本的に、動的データWebサイトを使用して、エンティティが独自のアセンブリにあるEF4モデルでデータを維持したいと思います。モデルとコンテキストは別のアセンブリにあります。

このエンティティフレームワーク4+自己追跡エンティティ+ASP.NET動的データ=エラーを試しました

しかし、リフレクションから「あいまいな一致」エラーが発生します。

System.Reflection.AmbiguousMatchExceptionは、ユーザーコードによって処理されませんでした。Message=あいまいな一致が見つかりました。Source = mscorlib StackTrace:at System.RuntimeType.GetPropertyImpl(String name、BindingFlags bindingAttr、Binderバインダー、Type returnType、Type [] types、ParameterModifier []修飾子)at System.Type.GetProperty(String name)at System.Web.DynamicData .ModelProviders.EFTableProvider..ctor(EFDataModelProvider dataModel、EntitySet entitySet、EntityType entityType、Type entityClrType、Type parentEntityClrType、Type rootEntityClrType、String name)at System.Web.DynamicData.ModelProviders.EFDataModelProvider.CreateTableProvider(EntitySet entitySet、EntityType entityType)at System .Web.DynamicData.ModelProviders.EFDataModelProvider..ctor(Object contextInstance、Func1 contextFactory) at System.Web.DynamicData.ModelProviders.SchemaCreator.CreateDataModel(Object contextInstance, Func1 contextFactory)at System.Web.DynamicData.MetaModel.RegisterContext(Func`1 contextFactory、ContextConfiguration configuration)at WebApplication1.Global.RegisterRoutes(RouteCollectionroots)in C:\ dev \ Puffin \ Puffin.Prototype.Web\Global.asax。 cs:line 42 at WebApplication1.Global.Application_Start(Object sender、EventArgs e)in C:\ dev \ Puffin \ Puffin.Prototype.Web \ Global.asax.cs:line 78 InnerException:

4

1 に答える 1

1

私は最近これと同様の問題に遭遇しました。それは私のモデルの継承と関係がありました。Person、Equipmentなどのタイプを派生させたResourceエンティティがあり、それらの中でいくつかのプロパティをオーバーライドしましたが、誤って異なる署名を付けました。私のシナリオを説明し、うまくいけばそれが役立つでしょう。

フレームワークを十分に深くデバッグし、すべての変数値を確認できるようにするには、最適化を無効にする必要があります。

http://blogs.msdn.com/b/kirillosenkov/archive/2009/01/27/how-to-disable-optimizations-during-debugging.aspx

Global.asaxにコンテキストを登録すると、次のようにあいまいな一致エラーが発生しました。

    public static void RegisterRoutes(RouteCollection routes)
    {
        //                    IMPORTANT: DATA MODEL REGISTRATION 
        // Uncomment this line to register an ADO.NET Entity Framework model for ASP.NET Dynamic Data.
        // Set ScaffoldAllTables = true only if you are sure that you want all tables in the
        // data model to support a scaffold (i.e. templates) view. To control scaffolding for
        // individual tables, create a partial class for the table and apply the
        // [ScaffoldTable(true)] attribute to the partial class.
        // Note: Make sure that you change "YourDataContextType" to the name of the data context
        // class in your application. 
        DefaultModel.RegisterContext(typeof(EntityModelContainer), new ContextConfiguration() { ScaffoldAllTables = true });

RegisterContextメソッドにステップインして、System.Web.DynamicData.ModelProviders.EFDataModelProviderに移動しました。これには、EFDataModelProviderのコンストラクターの継承階層をトラバースすることにより、モデル内のすべてのエンティティをロードするコードのセクションがあります。

while(objectStack.Any()){EntityType entityType = objectStack.Pop(); if(entityType!= null){//別のルートタイプ(ベースタイプのないタイプ)にいるときにエンティティセットを更新します。if(entityType.BaseType == null){currentEntitySet = entitySetLookup [entityType]; }

                var table = CreateTableProvider(currentEntitySet, entityType); 
                tables.Add(table);
            } 

            foreach (EntityType derivedEntityType in derivedTypesLookup[entityType]) {
                // Push the derived entity types on the stack
                objectStack.Push(derivedEntityType); 
            }
        } 

ここにブレークポイントを設定し、Equipmentエンティティ(Resourceから派生)でCreateTableProviderを呼び出すと、あいまいな一致が発生していることを確認できました。

元の例外からのスタックトレースを振り返ると(最初に実行する必要がありました!)、System.Web.DynamicData.ModelProviders.EFTableProvider.IsPublicPropertyのコンストラクターにブレークポイントを設定し、どのプロパティ/メソッド/を監視しました。あいまいな一致を引き起こしているものは何でも-私にとって、これは私が機器でオーバーライドしたリソース(リソース自体は階層です)と呼ばれるナビゲーションプロパティになりました。

  private static bool IsPublicProperty(Type entityClrType, string propertyName) {
        var property = entityClrType.GetProperty(propertyName); 
        return property != null && property.GetGetMethod() != null; 
    }

機器の部分クラスでは、次のようになりました。

public partial class Equipment
{
    public new IEnumerable<Resource> Resources
    {

ただし、親クラスのResourceでは、Resourcesは次のように定義されています。

    public virtual ICollection<Resource> Resources
    {

これらのプロパティがIsPublicPropertyの.GetProperty(propertyName)によってロードされている場合、名前は同じですが署名が異なるため(誤って異なるリターンタイプを指定したため)、名前だけに基づいてどのshoudlをロードするかが明確ではありません。 。私は間違いを訂正し、EquipmentクラスのResourcesがICollectionを返すようにし、ブームを起こしました。これ以上あいまいな一致はありません。

これが役立つかどうかはわかりませんが、同様の方法でステップスルーすると、あいまいな一致の原因を正確に見つけることができるはずです。

于 2010-05-27T23:17:33.157 に答える