[英]The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects Entity Framework
[英]The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects
我在SQL中有2個表。 一種稱為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);
}
現在,用戶保存了Training(一些字段,如Date,Time,Topic已附加到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
(培訓的全局變量)並將其作為變量傳遞:
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;
上引發錯誤currentUczestnik.Szkolenie = szkolenie;
我用2個解決方案解決了它。
我已經聲明private EntityBazaCRM context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM);
在我的課堂上,並一直重復使用它,而沒有using
它。 由於此操作,我不必在保存之前附加任何東西。 我只是使用相同的上下文,並使用currentUczestnik.Szkolenie = szkolenie;
附加了我想要的任何外鍵currentUczestnik.Szkolenie = szkolenie;
和現任Uczestnik.Konsultanci =顧問; 它保存沒有問題。
而不是像currentUczestnik.Szkolenie = szkolenie;
那樣附加整個對象currentUczestnik.Szkolenie = szkolenie;
我通過EntityKey在SzkolenieReference和SzkolenieID上添加了它。
context.Attach(szkolenie); context.Szkolenies.Attach(szkolenie); currentUczestnik.SzkolenieReference.EntityKey = szkolenie.EntityKey; currentUczestnik.SzkolenieID = szkolenie.SzkolenieID;
解決方案3是在舊對象的基礎上創建新對象。 引用的Konsultanci和Szkolenia是重新同步的(我認為它實際上是從db中獲取它們)。
using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) { if (currentUczestnik.SzkolenieUczestnicyID == 0) { var nowy = new SzkolenieUczestnicy { Konsultanci = context.Konsultancis.First(p => p.KonsultantNazwa == currentUczestnik.Konsultanci.KonsultantNazwa), Szkolenie = context.Szkolenies.First(p => p.SzkolenieID == varSzkolenie.SzkolenieID), SzkolenieUzytkownik = currentUczestnik.SzkolenieUzytkownik, SzkolenieUzytkownikData = currentUczestnik.SzkolenieUzytkownikData, UczestnikPotwierdzilUdzial = currentUczestnik.UczestnikPotwierdzilUdzial, UczestnikPrzybyl = currentUczestnik.UczestnikPrzybyl }; context.SzkolenieUczestnicies.AddObject(nowy); context.SaveChanges(); listaDoPodmiany.Add(nowy);
解決方案編號4是我最終使用的解決方案。 基本上,它會將所有引用的對象清零(首先將它們臨時保存到對象中),然后在保存之前僅使用其ID值。 然后在保存對象后重新附加。
foreach (SzkolenieUczestnicy uczestnik in listaUczestnikow.Objects) { using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) { if (uczestnik.SzkolenieUczestnicyID == 0) { // add new object var konsultant = uczestnik.Konsultanci; uczestnik.Konsultanci = null; // null attached object and reuse it's ID later on for SAVE purposes uczestnik.KonsultantNazwa = konsultant.KonsultantNazwa; uczestnik.Szkolenie = null; // null attached object and reuse it's ID later on for SAVE purposes uczestnik.SzkolenieID = szkolenie.SzkolenieID; context.SzkolenieUczestnicies.AddObject(uczestnik); context.SaveChanges(); context.Detach(uczestnik); // detatch to prevent Context problems uczestnik.Szkolenie = szkolenie;// reassign for use in ObjectListView uczestnik.Konsultanci = konsultant; // reassign for use in ObjectListView } else { // modify exisinng object context.SzkolenieUczestnicies.Attach(uczestnik); //context.ObjectStateManager.ChangeObjectState(uczestnik, EntityState.Modified); context.SaveChanges(); } } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.