使用LINQ to Entity插入或更新

时间:2011-12-19 05:19:39

标签: c# linq entity

我正在尝试使用Linq to Entity作为新项目的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;
    }

我在我的程序中使用Job实体,然后我想保存它:

我尝试了一些不同的东西,但是当前我的方法看起来像这样(它不起作用)

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

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

我建议您考虑在application.xaml.cs中保留一个属性,如

public TNEntities context {get; private set;}

它的TNEntities在启动时初始化。它会让你的生活更轻松。