2013-04-06 4 views
1

Это приложение MVC с Entity Framework Code Сначала для ORM и MEF в качестве IoC. Если я отмечаю DbContext с PartCreationPolicy.Shared, возникает ошибка, указывающая, что объект уже существует в контейнере каждый раз, когда я пытаюсь выполнить редактирование. Но что, если я просто помечаю DbContextPartCreationPolicy.NonShared, чтобы он создавался для каждого запроса? Есть ли ужасное влияние для этого?Является ли NonShared DbContext в MVC плохой практикой?

Update Вот код для сохранения:

Provider IRepository<Provider>.Put(Provider item) 
     { 
      if (item.Id == Guid.Empty) 
      { 
       item.Id = Guid.NewGuid(); 
       this.Providers.Add(item); 
      } 
      else this.Entry<Provider>(item).State = EntityState.Modified; 
      return item; 
     } 

И это ошибка, когда на Shared

Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с тем же ключом .

+0

Я только что разместил код и сообщение об ошибке. – Vahid

+0

Я думаю, что проблема связана с вашими несколькими объектами с тем же ключом в таблице «Поставщик» –

+0

@BhushanFirake Это невозможно, Code First, используя атрибут '[Key]', будет формировать первичный ключ, который будет ** никогда ** разрешить дубликаты. – mattytommo

ответ

3

Вы должны обязательно использовать PartCreationPolicy.NonShared. Все, что вы можете прочитать об управлении жизненным циклом контекста, будь то linq to sql, инфраструктура сущностей или NHibernate (сеансы), будет соглашаться на одно: контекст должен быть недолгим. Легкое правило большого пальца: используйте его для один единица работы, что означает: создать контекст, сделать что-то, вызвать SaveChanges один раз, распоряжаться. В большинстве случаев это правило хорошо работает для меня.

Общий (или одиночный) контекст - это шаблон, который поражает производительность, потому что контекст становится раздутым с течением времени. Трекер изменений должен отслеживать все больше объектов, исправление отношений будет медленнее. И вы снова и снова будете обновлять (повторно загружать) объекты.

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