4

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

Проблема заключается в следующем:

Я использую Entity Framework 5.0 с кодовым первым подходом плюс наследованием для своей бизнес-моделей, представленной таблицы на Иерархии. Сначала у меня были все типы сущностей, которые должны были отображаться, в той же сборке, что и мой DbContext (который отлично работал как для TPH, так и для TPT). Но поскольку они также содержат логику, которая зависит от других сборок, это оказалось хорошим подходом, поскольку вызвало круговые зависимости, потому что эти сборки также должны обладать знаниями уровня доступа к данным, который, в свою очередь, должен знать типы сущностей что он должен отображаться).

Я решил эту проблему, представив проект CommonObjects, в котором теперь я сохраняю все свои абстрактные классы и лишил конкретных потомков (содержащих логику и т. Д.) Этих базовых классов в конкретные проекты, которые отвечают за их. (см .: Circular Dependency Solution)

Он скомпилирован, и все, казалось, соответствовало тому, как я себе это представлял. Но теперь выяснилось, что Entity Framework, похоже, борется с производными, находящимися в другой сборке, чем базовые классы.

Во время выполнения, когда пытаются получить доступ к DbContext в первый раз, компилятор бросил InvalidOperationException говоря:

абстрактного типа «Foo.Bar.AbstractClass» не имеет отображенные потомков и поэтому не может быть отображена , Либо удалите 'Foo.Bar.AbstractClass' из модели или добавьте один или несколько типов, полученных от 'Foo.Bar.AbstractClass' к модели.

Таким образом, EF, очевидно, не может найти потомков, поскольку он знает только базовые классы (которые находятся в проекте CommonObjects), но потомки находятся в другой сборке.

DbSet<AbstractClass> AbstractClasses { get; set; } 

По этому вопросу: Entity Framework Code First and Multiple Assemblies Я пытался добавить следующий код в конструктор моего производного DbContext:

((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(
      Assembly.Load("Foo1")); 

Но это не работает для меня. При отладке и просмотре MetadataWorkspace метод «LoadFromAssembly» явно не влиял на MetadataWorkspace и его элементы (никакие типы не были загружены из сборки Foo1).

Что мне здесь не хватает?

Спасибо за ваши ответы заранее.

Бен

ответ

1

EDIT: Это только едва работает и не стоит, и не работает на всех, если вы используете CodeFirst.

Сначала я столкнулся с одной и той же проблемой с кодом. Я попробовал ваш метод отражения. Это кажется немного неудобным, но вы можете обмануть EF, чтобы быть в порядке с вашей настройкой с внутренним классом.

internal class ClassToMakeEFHappy : AbstractClass {} 

Я только что создал это в том же файле, что и определение AbstractClass, и это сделало трюк.

Смежные вопросы