2013-05-09 52 views
0

我有它創建了一個上下文和檢索數據(沒有物體跟蹤),並將信息傳遞迴UI層數據訪問層: -附加VS選擇和修改L2S

我的工作的單元是這樣的方法並在執行特定方法後發佈appdatacontext。所以,我不跟蹤任何地方的數據上下文的..

public LinqObject GetObject(){ 
    using (appdatacontext = new DataContext()){ 

---code to select and return object 
    } 
} 

我會使用UI形式的修改數據,我的數據提交回數據庫。

有兩種方法: -

1. Detach and reattach to a different data context using [Detach..Serialise and Attach] 

*I have to do a lot of plumping code to enable this functionality* 

2. Get the DB object using primary key and make changes in the selected object and SubmitChanges. 

哪一個是完成這個任務更好的方法?

我完全反對將工作單元移動到數據訪問層明智或Web應用程序生命週期(httpcontext),因爲我不想跟蹤更改並使整個應用程序結構複雜化,並且不需要使用豐富的代碼。我只是使用LINQ將我的檢索和更新簡化爲DB。

我從來沒有見過任何人在LINQ環境下討論這兩種方法,這就是爲什麼我要求最佳實踐。

+0

我建議你檢查[This](http://www.codeproject.com/Articles/33088/Reattaching-Entity-Graphs-with-the-Entity-Framewor)。這是您的第一個選擇解決方案。我必須在EF 3.5中使用它。我不知道這是否在4.0及更高版本中解決。 – noobob 2013-05-09 12:16:25

回答

0

根據@ Chris的評論。我終於來到了解決方案,如: -

function void SaveRow(Table.RowObject object) { 

    var original=null; 

    using (context= new DataContext()) 
     { 

      context.ObjectTrackingEnabled = false; 
      original = {query}.Single(); 

     } 
     using(context=new DataContext()){ 
      try 
      { 
       context.Table.Attach(object, original); 
       context.SubmitChanges(); 
      } 
      catch (Exception exception) { 

       saveStatus = false; 

      } 
     } 

}

我不停的更新檢查,以確保沒有併發檢查,如果我停用,我可以減少LINQ的生成的WHERE語句的數量。

1

如果您不想因爲性能而選擇(2):另一種選擇是附加一個新對象來提交更新。

Foo foo=new Foo { FooId=fooId }; // create obj and set keys 
context.Foos.Attach(foo); 
foo.Name="test"; 
context.SubmitChanges(); 

See my answer here

+0

我試過了,並且正在工作,因爲您知道我必須手動繼續並在提交更改之前分配每個值。如何一次性複製我的實體值並提交更改?我試過克隆(DatacontractSerializer)我傳遞的對象並分配它,但它不工作。任何解決方案 – 2013-05-10 09:35:40

+0

你可以通過反射來做到這一點。 – laktak 2013-05-10 10:02:22