2011-12-19 91 views
1

我正在嘗試使用Linq to Entity作爲我的DAL用於新項目。LINQ to Entity插入或更新

在我DAL我有這樣的方法來獲取工作實體

public Job LoadJob(int id) 
    { 
     Job job = new Job(); 

     using (TNEntities context = new TNEntities()) 
     { 
      var jobEntity = (from c in context.Jobs 
         where c.id == id 
         select c).First(); 

      job = (Job)jobEntity;     
     } 

     return job; 
    } 

我用的是工作實體在我的程序,然後我想將它保存:

我已經嘗試了一些不同的的事情,但我currenlt方法看起來是這樣的(它不工作)

public void SaveJob(Job job) 
    { 
     using (TNEntities context = new TNEntities()) 
     { 
      context.Jobs.AddObject(job); 
      context.SaveChanges(); 
     } 
    } 

我已經試過context.jobs.attach(作業),它不會引發錯誤,但它並沒有更新我的工作。我認爲它是因爲Job超出了Context,因爲它超出了使用上下文的範圍。但我不知道如何重新附加它,以便更新我在第一種方法中選擇的作業。

回答

0

理想情況下,您想從上下文中讀取作業,進行更改,然後調用上的相同上下文上的SaveChanges。它可能(應該)可以將修改後的實體附加到新的上下文中,並將其狀態設置爲已修改,但是我發現修改後的子對象受此方法的影響。

其中一種更簡單的方法是將所有這些操作都放在DataAccess對象中,該對象具有您的TNEntities上下文的一個實例,並用它來讀取作業實體並保存更改。

public class JobDao : IDisposable { 

    TNEntities context = new TNEntities(); 

    public Job LoadJob(int id) 
    { 
     return this.context.Jobs.First(c => c.id == id); 
    } 

    public void Save(){ 
     this.context.SaveChanges(); 
    } 

    public void Dispose(){ 
     this.Context.Dispose(); 
    } 
} 

(當然你要放了很多的樣板代碼到一個基類)

using(JobDao dao = new JobDao()) { 
    Job j = dao.LoadJob(12); 
    j.JobTitle = "Software Developer"; 
    dao.Save(); 
} 
+0

沒有其他辦法嗎?如果我想下載我的實體並傳遞它,我將不得不繞過我的DAL類嗎? – michael 2011-12-19 05:26:30

+0

@ michael - 這將是最簡單的方法。只需重新考慮你的方法 - 使用DAO來做這種事情可以非常乾淨和容易 – 2011-12-19 05:32:07

0

我會建議你考慮離開屬性在application.xaml.cs像

public TNEntities context {get; private set;} 

它的TNEntities在啓動時已初始化。它會讓你的生活更輕鬆。

+0

Windows窗體程序中的application.xaml.cs文件在哪裏? – michael 2011-12-19 06:31:29

+0

你在做什麼類型的項目?的WinForms/WPF/Silverlight的/網頁? – 2011-12-19 06:38:50

+0

DAL將由WinForms和一個網頁使用 – michael 2011-12-19 06:42:43