簡體   English   中英

無法定義兩個對象之間的關系,因為它們已附加到不同的ObjectContext對象

[英]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個解決方案解決了它。

  1. 我已經聲明private EntityBazaCRM context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM); 在我的課堂上,並一直重復使用它,而沒有using它。 由於此操作,我不必在保存之前附加任何東西。 我只是使用相同的上下文,並使用currentUczestnik.Szkolenie = szkolenie;附加了我想要的任何外鍵currentUczestnik.Szkolenie = szkolenie; 和現任Uczestnik.Konsultanci =顧問; 它保存沒有問題。

  2. 而不是像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. 解決方案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. 解決方案編號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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM