2012-01-31 5 views
0

Вопрос this У меня возникла проблема с сохранением объектов с внешними ключами, потому что Objects были созданы из нескольких Objects, связанных друг с другом через внешние ключи, но каждый раз они загружались с использованием разных контекстов. Например:Можно ли постоянно использовать контекст Framework Entity Framework в коде?

using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) { 
     IQueryable<Konsultanci> listaKonsultantow = from k in context.Konsultancis 
           select k; 

    } 

Потом где-то в коде будет больше context использоваться, чтобы получить больше типов объектов, таких как человек, обучение, вы называете это.

Тогда бы код, чтобы сохранить его (упрощенно):

 using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) { 
      if (context.Szkolenies.Any(t => t.SzkolenieID == currentSzkolenie.SzkolenieID)) { 
       context.Szkolenies.Attach(currentSzkolenie); 
       context.ObjectStateManager.ChangeObjectState(currentSzkolenie, EntityState.Modified); 
      } else { 
       context.Szkolenies.AddObject(currentSzkolenie); 
      } 
      context.SaveChanges(); 


     } 

Обычно после того, как пытался спасти его было бы несколько сообщений об ошибках

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

или

The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects

и несколько других.

Чтобы решить эту проблему, я объявил private EntityBazaCRM context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM); над своим классом и использовал его все время, не помещая его в using. Благодаря этому действию я не должен был прикреплять что-либо до сохранения или чего-либо еще. Я просто использовал тот же контекст и приложил любые внешние ключи, которые я хотел использовать, используя currentUczestnik.Szkolenie = szkolenie; и currentUczestnik.Konsultanci = консультанты ;. Это спасло без проблем.

На вопросе:

Он работает для небольшого графического интерфейса, который есть у меня сейчас, не усложненный. Но что, если я введу многопоточность, попытаюсь получить несколько значений по всему месту для разных объектов (загрузить объект в GUI, в ListView и т. Д.), Используя тот же контекст? Разве это не ударит меня по мне, серьезно меня огорчает?

В моем старом коде, прежде чем я узнал о Entity Framework, я использую:

 const string preparedCommand = @"SELECT ID FROM TABLE WHERE NAME = "TEST""; 
     using (SqlConnection varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) 
     using (SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader()) 
      while (sqlQueryResult.Read()) { 
       string id= sqlQueryResult["id"].ToString(); 
      } 
     } 

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

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

+0

[This] (http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392) может объяснить вам, почему вы не должны использовать контекст ни для чего другого, кроме отдельной бизнес-единицы работа (однопоточная логическая бизнес-операция). –

ответ

2

Но что, если я ввожу многопоточность, попытайтесь получить несколько значений со всего местом для различных объектов (объекта нагрузки на графический интерфейс, чтобы ListView и т.д.), используя один и тот же контекст? Не удастся ли мне на мне нанести урон мне строго?

Да, да, будет. Контекст - это в основном тонкий слой поверх соединения с базой данных, который не является потокобезопасным, поэтому вы не можете повторно использовать один и тот же контекст в потоках. То, что вы ищете, представляет собой единицу работы, в рамках которой вы используете один и тот же контекст, но как только эта часть работы будет завершена, вы избавитесь от контекста.Поскольку вы используете свою собственную репозитарию, вам нужно будет создать единицу работы поверх этих репозиториев.

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