EF6: указанная схема недействительна; неоднозначное отображение

Я использую EF6 с первым подходом к базе данных. В базе данных есть три простые таблицы: Person, Token и Template.

Для базы данных я создал модель и объекты edmx.

Person.cs

public partial class Person
{
    public Person()
    {
        this.Tokens = new HashSet<Token>();
    }
    public long Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PersonImage { get; set; }
    public string Repository { get; set; }
    public byte[] RepositoryHash { get; set; }
    public virtual ICollection<Token> Tokens { get; set; }
}

Токен.cs

public partial class Token
{
    public long Id { get; set; }
    public string TokenImage { get; set; }
    public string NormalizedTokenImage { get; set; }
    public long PersonId { get; set; }
    public long TemplateId { get; set; }
    public string TokenType { get; set; }
    public string Repository { get; set; }
    public byte[] RepositoryHash { get; set; }
    public virtual Person Person { get; set; }
    public virtual Template Template { get; set; }
}

Шаблон.cs

public partial class Template
{
    public Template()
    {
        this.Tokens = new HashSet<Token>();
    }
    public long Id { get; set; }
    public string TemplateFile { get; set; }
    public string TemplateType { get; set; }
    public string Repository { get; set; }
    public byte[] RepositoryHash { get; set; }
    public virtual ICollection<Token> Tokens { get; set; }
}

Приложение основано на MEF и при необходимости загружает DataProviderModule, который предоставляет данные с использованием EF6. Рабочий процесс приложения разделен на две фазы. На первом этапе инициализируются необходимые модули и загружается конфигурация для этих модулей. Затем я создаю некоторые данные и сохраняю их с DataProviderModule в базе данных. На этом первый этап заканчивается - пока все хорошо.

Когда начинается вторая фаза, я очищаю старые ссылки на модули и загружаю новый набор модулей с новым экземпляром DataProviderModule. Но теперь, когда я пытаюсь использовать EF внутри DataProviderModule, выдается исключение MetadataException (когда я пытаюсь получить данные из базы данных)

using (var entities = new Entities(_connectionString))
{
    return entities.People.Count() // <-- MetadataException thrown here
}

Исключение метаданных

Schema specified is not valid. Errors: 
The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Person'. 
Previously found CLR type 'MSSQLDBLib.Model.Person', 
newly found CLR type 'MSSQLDBLib.Model.Person'.

The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Template'. 
Previously found CLR type 'MSSQLDBLib.Model.Template', 
newly found CLR type 'MSSQLDBLib.Model.Template'.

The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Token'. 
Previously found CLR type 'MSSQLDBLib.Model.Token', 
newly found CLR type 'MSSQLDBLib.Model.Token'.

Трассировки стека

   at System.Data.Entity.Core.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage)
   at System.Data.Entity.Core.Metadata.Edm.ObjectItemCollection.ExplicitLoadFromAssembly(Assembly assembly, EdmItemCollection edmItemCollection, Action`1 logLoadMessage)
   at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.ExplicitLoadFromAssembly(Assembly assembly, ObjectItemCollection collection, Action`1 logLoadMessage)
   at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.LoadFromAssembly(Assembly assembly, Action`1 logLoadMessage)
   at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.LoadFromAssembly(Assembly assembly)
   at System.Data.Entity.Core.Metadata.Edm.MetadataOptimization.TryUpdateEntitySetMappingsForType(Type entityType)
   at System.Data.Entity.Internal.InternalContext.TryUpdateEntitySetMappingsForType(Type entityType)
   at System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType)
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
   at System.Linq.Queryable.Count[TSource](IQueryable`1 source, Expression`1 predicate)
   at MSSQLDBLib.MsSqlPersonalDataProvider.GetPersonsCount()
   at DirectoryCompareApp.ViewModel.MainViewModel.<Start>d__5f.MoveNext() in d:\pzajic\SecufaceCollection\SecufaceNG\Sources\SecufaceNG\DirectoryCompareApp\ViewModel\MainViewModel.cs:line 810

Я уже искал, как решить эту проблему, и я только обнаружил, что одни и те же имена классов в разных пространствах имен могут вызывать аналогичную проблему, но это не мой случай, потому что классы находятся в одном и том же пространстве имен.

Любой совет будет принят с благодарностью. Спасибо.


person Aldaris    schedule 11.06.2015    source источник


Ответы (1)


После нескольких часов отчаянных поисков, что не так, я наконец нашел решение. Проблема в том, что я дважды сочиняю части MEF. Каждый раз для каждой фазы моего рабочего процесса, и я думаю, что одна и та же библиотека загружается дважды в AppDomain. Затем EF видит два одинаковых класса в одном и том же пространстве имен.

Решение было очень простым — в моем коде, где я создаю каталог сборки и компоную части, мне нужно добавить флаг, чтобы эта часть выполнялась только один раз.

person Aldaris    schedule 12.06.2015