В этом вопросе у меня возникла проблема с сохранением объектов, которые имели внешние ключи, потому что Objects
были созданы из нескольких Objects
, соединенных друг с другом через внешние ключи, но они каждый раз загружались с использованием различного контекста , Например:
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 = consultants ;. Сохранено без проблем.
На вопрос:
Это работает для небольшого графического интерфейса, который у меня есть, который не слишком сложен. Но что, если я ввожу многопоточность, попробуйте получить несколько значений из разных мест для разных объектов (загрузка объекта в 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. Если бы не было соединения, оно было бы установлено, если бы было соединение, оно использовалось бы повторно и не было проблем с многопоточностью.
Может кто-нибудь сказать мне, какие проблемы я могу ожидать от того, как я это выяснил, работая? Или, может быть, это лучший способ сделать это?