我正在尝试使用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,因为它超出了使用上下文的范围。但我不知道如何重新附加它,以便更新我在第一种方法中选择的作业。
答案 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在启动时初始化。它会让你的生活更轻松。