2011-12-19 88 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