C# 使用LINQ插入或更新到实体

C# 使用LINQ插入或更新到实体,c#,linq,entity,C#,Linq,Entity,我正在尝试使用LINQtoEntity作为新项目的DAL 在我的DAL中,我有这个方法来获取作业实体 public Job LoadJob(int id) { Job job = new Job(); using (TNEntities context = new TNEntities()) { var jobEntity = (from c in context.Jobs

我正在尝试使用LINQtoEntity作为新项目的DAL

在我的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我的方法是这样的(它不起作用)


我尝试了context.jobs.attach(作业),它不会抛出错误,但不会更新我的作业。我假设它是因为作业脱离了上下文,因为它超出了使用上下文的范围。但我不知道如何重新附加它,以便它更新我在第一个方法中选择的作业

理想情况下,您希望从上下文中读取作业,进行更改,然后在最初读取作业的相同上下文中调用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();
    }
}
(当然,您需要将大量样板代码放入基类中)


我建议你考虑在你的申请中留下一个财产。
public TNEntities context {get; private set;}

它在启动时就已经初始化了。这会让你的生活更轻松。

没有别的办法了吗?如果我想下载我的实体并传递它,我必须用它传递我的DAL类?@michael-这将是最简单的方法。重新考虑一下你的方法-使用DAOs来完成这类事情可以非常干净和简单windows窗体程序中的application.xaml.cs文件在哪里?你在做什么类型的项目?WinForms/WPF/Silverlight/Web?DAL将由WinForms使用,WebgeApplication.xaml.cs仅为Silverlight/WPF。winforms版本将把它放在主窗口上,并确保所有其他窗口都有对主窗口的引用,以便它们可以获取该属性。在网络上,并没有可比性(好吧,我在那个里并没有太多经验),但你们的设计无论如何是不同的。
using(JobDao dao = new JobDao()) {
   Job j = dao.LoadJob(12);
   j.JobTitle = "Software Developer";
   dao.Save();
}
public TNEntities context {get; private set;}