用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脱离了上下文,因为它超出了使用上下文的范围。但我不知道如何重新连接它,所以它更新的工作,我选择在我的第一个方法。
理想情况下,您希望从上下文中读取作业,进行更改,然后在最初读取作业的上下文中调用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。这会让你的生活更轻松。