在保存它以解决多个上下文问题之前,在Entity Framework中创建新对象是否有意义?

时间:2012-02-01 09:58:28

标签: c# winforms entity-framework entity-framework-4.1

在尝试保存已加载但具有多个上下文的对象之前创建新对象是否有意义?

经过多次尝试和错误后,这段代码似乎运行正常。基本上,它使用基于从ObjectListView读取的对象的当前Context来重用KonsultanciSzkolenie的值。

        var listaDoPodmiany = new List<SzkolenieUczestnicy>();
        if (listaUczestnikow.GetItemCount() > 0) {
            foreach (SzkolenieUczestnicy currentUczestnik in listaUczestnikow.Objects) {
                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);
                    } else {


                        context.SzkolenieUczestnicies.Attach(currentUczestnik);
                        context.ObjectStateManager.ChangeObjectState(currentUczestnik, EntityState.Modified);
                        context.SaveChanges();
                        listaDoPodmiany.Add(currentUczestnik);
                    }
                }
            }
            listaUczestnikow.ClearObjects();
            listaUczestnikow.SetObjects(listaDoPodmiany);
        }

这似乎解决了我在多个上下文中遇到的很多问题。但这是好方法吗?是否会对速度产生太大影响,因为我猜Konsultanci和Szkolenie将再次从SQL中读取?

这是延续(或者更像我之前提出的多个问题的结论):

1 个答案:

答案 0 :(得分:4)

  

在尝试保存对象之前创建新对象是否有意义   我已经加载但有多个上下文?

没有。但它在您的应用程序中显示您有设计问题您不必为同一个对象处理多个上下文

我认为您的上下文生命存在问题。这不是一个容易解决的问题,但这里有an article可以帮到你。另请参阅here

我的观点是,语境应尽可能保持最短的生命周期。长时间运行的上下文通常是一种糟糕的做法,因为您很快就会遇到应用程序中的问题(内存泄漏,处理多线程或并发时的问题等等)。

如果你有3层架构,那么你真的应该公开无状态服务,为每个请求创建一个新的上下文。如果您从应用程序(2层应用程序)直接访问数据库,例如直接请求数据库的Winform应用程序,尽可能缩短上下文的生命周期如果可以的话做无国籍的请求。

最后一句话:创建新的上下文的开销非常小,并且99%的时间都不会导致性能问题。