У меня есть 2 таблицы в SQL. Один называется Training
, а другой - Consultants
. Обучение - это пара полей, таких как ID, Place, Time, Date
, и оно также имеет ConsultantName
, который является внешним ключом и связан с Consultants
, имеющим ConsultantName, ConsultantFirstName и т. Д.
Во время сохранения тренинга я сначала сохраняю тренировку, а затем передаю значение тренинга как varTraining. Я попытался привязать его к контексту в соответствии с некоторыми советами, которые я нашел в стеке, но, похоже, он не работает:
Training Training = context.Trainings.First(p => p.TrainingID == varTraining.TrainingID);
context.Trainings.Attach(Training);
currentUczestnik.Training = Training;
Вот код:
using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM))
{
Training Training = context.Trainings.First(p => p.TrainingID == varTraining.TrainingID);
foreach (var currentUczestnik in listaUczestnikow)
{
context.Trainings.Attach(Training);
currentUczestnik.Training = Training;
if (context.TrainingUczestnicies.Any(t => t.TrainingUczestnicy1 == currentUczestnik.TrainingUczestnicy1))
{
context.TrainingUczestnicies.Attach(currentUczestnik);
context.ObjectStateManager.ChangeObjectState(currentUczestnik, EntityState.Modified);
}
else
{
// context.Detach(currentUczestnik.Consultant);
context.Consultants.Attach(currentUczestnik.Consultant);
context.TrainingUczestnicies.AddObject(currentUczestnik);
//context.TrainingUczestnicies.Attach(
}
}
try
{
context.SaveChanges();
}
catch (Exception ex)
{
string excepion = ex.InnerException.ToString();
MessageBox.Show(excepion);
}
}
Редактировать:
Полная история выглядит следующим образом.
Есть эта таблица с консультантами. Люди загружены:
using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) {
IQueryable<Konsultanci> listaKonsultantow = from k in context.Konsultancis select k;
objectListViewKonsultanci.SetObjects(listaKonsultantow);
}
Они загружаются в ObjectListview. Затем, когда пользователь нажимает на этот ObjectListView, следующие консультанты «копируются» в участников ObjectListView.
foreach (Konsultanci konsultant in objectListViewKonsultanci.SelectedObjects) {
dodajUczestnikowSzkolen(konsultant);
}
Создается новый объект с именем SzkolenieUczestniczy (Участники), и консультант назначается ему при подключении. Также добавлено еще несколько свойств.
private void dodajUczestnikowSzkolen(Konsultanci konsultant) {
SzkolenieUczestnicy nowyUczestnik = new SzkolenieUczestnicy();
nowyUczestnik.Konsultanci = konsultant;
//nowyUczestnik.SzkolenieUzytkownik = Settings.currentlyLoggedKonsultant.KonsultantNazwa;
nowyUczestnik.SzkolenieUzytkownikData = DateTime.Now;
//listaUczestnicy.Add(nowyUczestnik);
objectListViewUczestnicy.AddObject(nowyUczestnik);
}
Теперь пользователи сохраняют Обучение (некоторые поля, такие как Дата, Время, Тема были прикреплены к currentSzkolenie (Обучение):
private void sqlZapiszSzkolenie() {
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();
context.Detach(currentSzkolenie);
}
}
Итак, после того, как я сохранил Обучение, и Обучение теперь находится в базе данных, я отправляюсь, чтобы сохранить Участников. Я беру currentSzkolenie
(глобальный var для Training) и передаю его как переменную:
private void sqlZapiszUczestnikow(ObjectListView listaUczestnikow, Szkolenie varSzkolenie) {
foreach (SzkolenieUczestnicy currentUczestnik in listaUczestnikow.Objects) {
using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) {
Szkolenie szkolenie = context.Szkolenies.First(p => p.SzkolenieID == varSzkolenie.SzkolenieID);
context.Attach(szkolenie);
currentUczestnik.Szkolenie = szkolenie;
// currentUczestnik.Szkolenie.EntityKey = szkolenie.EntityKey;
if (context.SzkolenieUczestnicies.Any(t => t.SzkolenieUczestnicy1 == currentUczestnik.SzkolenieUczestnicy1)) {
context.SzkolenieUczestnicies.Attach(currentUczestnik);
context.ObjectStateManager.ChangeObjectState(currentUczestnik, EntityState.Modified);
} else {
// context.Detach(currentUczestnik.Konsultanci);
context.Konsultancis.Attach(currentUczestnik.Konsultanci);
context.SzkolenieUczestnicies.AddObject(currentUczestnik);
//context.SzkolenieUczestnicies.Attach(
}
try {
context.SaveChanges();
} catch (Exception ex) {
string excepion = ex.InnerException.ToString();
MessageBox.Show(excepion);
}
}
}
}
А вот и все .. выдает ошибку на currentUczestnik.Szkolenie = szkolenie;