用LINQ插入或更新实体

本文关键字:更新 实体 插入 LINQ | 更新日期: 2023-09-27 18:18:19

我正在尝试使用Linq到实体作为我的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脱离了上下文,因为它超出了使用上下文的范围。但我不知道如何重新连接它,所以它更新的工作,我选择在我的第一个方法。

用LINQ插入或更新实体

理想情况下,您希望从上下文中读取作业,进行更改,然后在最初读取作业的上下文中调用SaveChanges。可能(应该)可以将修改后的实体附加到一个新的上下文,并将其状态设置为已修改,但我发现修改后的子对象被这种方法误用了。

一种更简单的方法是将所有这些操作放在具有TNEntities上下文实例的DataAccess对象中,并使用它读取作业实体并保存更改。

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();
}

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

public TNEntities context {get; private set;}

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