0

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

У меня есть проект ASP.NET MVC2, который я использую с Entity Framework 4 и классом репозитория. У меня есть простая внешняя связь, которую я определил. Когда я запускаю свой проект MVC, я могу загрузить форму MVC и обновить отношение внешнего ключа, установив идентификатор внешнего ключа на моем объекте. Я делаю это, вызвав OnPropertyIDChanging в частичном классе и установку EntityKey как так

this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value); 

Я создал второй проект, который является командной строкой проектом я использую, чтобы загрузить исходные данные для модели. Однако, когда я вызываю объект Репозитория для добавления объекта, который я получаю, он не может вставлять значения Null в таблицу дочерних сущностей (Производитель). Если я явно указать ссылку на родительский объект (продукт) в дочерний объект (Manufacturer) называл мое хранилище, чтобы получить объект производителя и настройка объекта производителя продукта я получаю исключение о том,

Объект сущности не может быть ссылка несколько экземпляров IEntityChangeTracker

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

Выполнение некоторых исследований, я видел, что, загружая объект из запроса, объектные отношения явно создаются через объект RelationshipEntry. Этого не происходит, когда я создаю объекты в приложении моей командной строки. Каков способ обойти это? Я предполагаю, что у меня будет такая же проблема, если я попытаюсь создать веб-службу, так как я создаю объект, не вызывая сначала SQL.

Во-вторых, существует ли наилучшая практика по управлению контекстом? Лучше ли иметь контекст, созданный и размещенный в каждом методе репозитория, глобальную ссылку в каждом из объектов репозитория или контекст, который передается каждому конструктору репозитория?

Спасибо!

Джон

ответ

3

Во-вторых, есть лучшие практики по управлению контекстом? Лучше ли иметь контекст, созданный и размещенный в каждом методе репозитория, глобальную ссылку в каждом из объектов репозитория или контекст, который передается каждому конструктору репозитория?

На самом деле, это важная проблема. Исправьте это, а другое нужно уйти.

Контекст должен быть единицей работы. Таким образом, для вашего веб-приложения это будет один запрос. На единицу работы должен быть ровно один контекст. Используйте DI, чтобы разделить его среди всего кода, который участвует в этой части работы, возможно, через ваши репозитории.

Для вашего приложения командной строки определите, что такое единица работы.

Это сообщение:

Объект объект не может ссылаться несколько экземпляров IEntityChangeTracker

... просто означает, «Вы не можете связать два объекта, которые принадлежат к различным условиям. Реальная проблема здесь заключается в том, что одновременно существуют два разных контекста: это не невозможно, но так сложно понять, что я считаю это «техникой только для экспертов».

Этот хак:

this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value); 

... больше не требуется в EF 4. В EF 4 вы можете создать свою модель с ассоциациями FK, а затем просто выполните:

this.ManufacturerId = value; 
+0

Возможно, у меня проблема с настройкой моего внешнего ключа. Я решил попробовать реализовать подход Model First и настроить внешний ключ таким образом (а не через базу данных). Однако, если я не установил EntityKey, я бы получил ошибку вставки для дочерних отношений. Это может быть еще один признак того, как управляется Контекст. –

+0

[This post] (http://blogs.msdn.com/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx) объясняет, как настроить связь FK с моделью первый. –

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