Entity Framework 4 POCO-сущности в отдельной сборке, сайт динамических данных? - PullRequest
0 голосов
/ 20 мая 2010

По сути, я хочу использовать веб-сайт с динамическими данными для ведения данных в модели EF4, в которой объекты находятся в собственной сборке. Модель и контекст находятся в другой сборке.

Я пробовал это Entity Framework 4 + Само отслеживаемые объекты + Динамические данные ASP.NET = Ошибка

но из отражения появляется ошибка "неоднозначного соответствия":

System.Reflection.AmbiguousMatchException не было обработано кодом пользователя Сообщение = найдено неоднозначное совпадение. Источник = mscorlib Трассировки стека: at System.RuntimeType.GetPropertyImpl (Имя строки, BindingFlags bindingAttr, Binder Binder, Тип returnType, Тип [Типы], Модификаторы ParameterModifier []) в System.Type.GetProperty (имя строки) в System.Web.DynamicData.ModelProviders.EFTableProvider..ctor (EFDataModelProvider dataModel, EntitySet entitySet, EntityType entityType, тип entityClrType, тип parentEntityClrType, тип rootEntityClrType, имя строки) в System.Web.DynamicData.ModelProviders.EFDataModelProvider.CreateTableProvider (EntitySet entitySet, EntityType entityType) в System.Web.DynamicData.ModelProviders.EFDataModelProvider..ctor (Object contextInstance, Func 1 contextFactory) at System.Web.DynamicData.ModelProviders.SchemaCreator.CreateDataModel(Object contextInstance, Func 1 contextFactory) в System.Web.DynamicData.MetaModel.RegisterContext (Func`1 contextFactory, конфигурация ContextConfiguration) в WebApplication1.Global.RegisterRoutes (маршруты RouteCollection) в C: \ dev \ Puffin \ Puffin.Prototype.Web \ Global.asax.cs: строка 42 в WebApplication1.Global.Application_Start (Отправитель объекта, EventArgs e) в C: \ dev \ Puffin \ Puffin.Prototype.Web \ Global.asax.cs: строка 78 InnerException:

1 Ответ

1 голос
/ 28 мая 2010

Недавно я столкнулся с подобной проблемой. Это было связано с наследованием в моей модели. У меня была сущность Resource, у которой были получены типы Person, Equipment и т. Д., И в тех, что я переопределил пару свойств, но по ошибке дал им разные подписи. Я опишу свой сценарий, и, надеюсь, он поможет.

Чтобы иметь возможность отладить достаточно глубоко в платформе и увидеть все значения переменных, вам придется отключить оптимизацию:

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

Я поставил точку останова здесь и смог увидеть, что неоднозначное совпадение происходит для меня при вызове CreateTableProvider для моего объекта Equipment (который был получен из Resource).

Оглядываясь на трассировку стека из исходного исключения (которое я должен был сделать в первую очередь!), Я установил точку останова в конструкторе для System.Web.DynamicData.ModelProviders.EFTableProvider.IsPublicProperty и посмотрел, какое свойство / method / независимо от того, что вызывало неоднозначное совпадение - для меня это оказалось навигационным свойством под названием Resources (ресурсы сами по себе являются иерархией), которое я переопределил в Equipment.

  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
    {

Когда эти свойства загружаются .GetProperty (propertyName) в IsPublicProperty, они имеют одно и то же имя, но разные подписи (потому что я дал им другой тип возвращаемого значения по ошибке), поэтому неясно, какие будут загружаться на основе на одно имя. Я исправил свою ошибку и заставил Ресурсы в своем классе Оборудования вернуть ICollection, а бум - не более неоднозначного соответствия.

Не уверен, поможет ли это или нет, но если вы пройдете подобным образом, вы сможете найти именно то, что вызывает неоднозначное совпадение.

...