我有一种更新某些表的方法。要获得更新,我需要先获得TestProcess
,但我不喜欢这样。如何在没有TestProcess
操作的情况下更新select(firstOrDefault)
,仅用于更新操作?
方法示例:
public void UpdateTestProcess(int id, string updateID)
{
using (TestEntities context = new TestEntities())
{
TestProcess pr = context.TestProcess.FirstOrDefault(x => x.MyID == id);
pr.UpdateID = updateID;
context.TestProcess.Attach(pr);
context.ObjectStateManager.ChangeObjectState(pr, EntityState.Modified);
context.SaveChanges();
}
}
答案 0 :(得分:6)
TestProcess pr = new TestProcess()
{
MyID == id,
};
context.Set<TestProcess>().Attach(pr);
pr.UpdateID = updateID;
context.SaveChanges();
如果您将值设置为该类型的默认值(例如,将int
设置为0
),则不会将其作为更改进行选择,您需要手动设置设置状态。
pr.UpdateID = updateID;
context.Entry(pr).Property(p => p.UpdateID).IsModified = true;
你可以把这些代码放在扩展方法中,这样你就可以做这样的事情(我将把实现作为练习):
Foo entity = this.DbContext.GetEntityForUpdate<Foo>(
item => item.ID, model.ID
);
this.DbContext.UpdateProperty(entity, item => item.Name, model.Name);
答案 1 :(得分:2)
您可以这样做(您可能应该拥有所有测试过程数据):
TestProcess pr = new TestProcess();
pr.Id = id;
pr.UpdateID = updateID;
context.Attach(pr);
context.ObjectStateManager.ChangeObjectState(pr, EntityState.Modified);
context.SaveChanges();
答案 2 :(得分:1)
代码:
TestProcess testprocess = dbcontext.TestProcesses.Attach(new TestProcess { MyID = id });
tp.UpdateID = updateID;
dbcontext.Entry<TestProcess>(testprocess).Property(tp => tp.UpdateID).IsModified = true;
dbcontext.Configuration.ValidateOnSaveEnabled = false;
dbcontext.SaveChanges();
结果TSQL:
exec sp_executesql N'UPDATE [dbo].[TestProcesses]
SET [UpdateID] = @0
WHERE ([MyID] = @1)
',N'@0 bigint,@1 bigint',@0=2,@1=1
注意:
&#34; IsModified = true&#34;因为当您创建新的TestProcess对象(仅填充了MyID属性)时,所有其他属性都具有其默认值(0,null等),因此需要使用line。如果要使用&#34;默认值&#34;更新数据库,实体框架将不会检测到更改,然后数据库将不会更新。
例如:
testprocess.UpdateID = null;
如果没有行&#34; IsModified = true&#34; 将无法工作,因为当您创建空的TestProcess对象时,属性UpdateID已经为空,您需要向EF说这个列必须更新,并且这就是这条线的目的。