Entity Framework Code First и несколько сборок

У меня есть подкласс в сборке, отличной от его базового класса. Родительский класс — это класс POCO, используемый для EF Code First.

Когда я пытаюсь добавить экземпляр унаследованного класса в базу данных, я получаю InvalidOperationException: "Не удалось найти сопоставление объектов для типа с идентификатором "Foo.Bar. MyInheritedClass'".

Он отлично работает, если подкласс находится в той же сборке, что и базовый класс.

В обычном EF решение выглядит вызов ObjectContext.MetadataWorkspace.LoadFromAssembly(сборка). Но я не могу понять, как это связано с Code First.

Любой совет?

Я использую Entity Framework 4.1 RC.


person David Russell    schedule 21.03.2011    source источник
comment
Почему вы все еще не можете вызвать эту функцию? На самом деле я не проверял, но на основе быстрого поиска вы должны иметь доступ к MetadataWorkspace из вашего DbContext с помощью dbContext.MetadatWorkspace. Это не работает?   -  person Kevin Cathcart    schedule 21.03.2011
comment
Да, вы можете привести DbContext к IObjectContextAdapter и получить его базовый ObjectContext (см.: weblogs.asp.net/jgalloway/archive/2011/01/21/).   -  person David Russell    schedule 23.03.2011
comment
Это позволило мне попробовать MetadataWorkspace.LoadFromAssembly(), но не решило мою проблему :(   -  person David Russell    schedule 23.03.2011


Ответы (3)


Я решил эту проблему, унаследовав от первой сборки DbContext, добавив DbSet‹> для производного класса, а затем добавив к нему новые экземпляры производного типа.

Код размещен на форуме MSDN здесь.

person David Russell    schedule 23.03.2011

Я знаю, что этот пост немного устарел, но я смог сделать это, используя рекомендацию @Dave внутри конструктора:

public Context() {
    ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(
        System.Reflection.Assembly.GetAssembly(
             typeof(--[Inherited DbContext]--)));
}
person kroehre    schedule 13.06.2011

Я новичок в EF (Entity Framework 4), и у меня было такое же исключение, когда я вносил изменения в модель.

Моя проблема оказалась в том, что я не знал, что EF нужно согласовать все имена во всех свойствах навигации, а не только их тип. Например, если есть свойство навигации с именем foo, то в соответствующем классе должна быть объявлена ​​переменная с таким же именем.

person John    schedule 04.10.2012