entity frameworkDbContext更新值无需查询和外键

我有一个更新一些表的方法。 对于更新,我需要获得TestProcess第一个,但我不喜欢它。 如何在没有select(firstOrDefault)操作的情况下更新TestProcess ,仅用于更新操作?

方法示例:

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

 TestProcess pr = new TestProcess() { MyID == id, }; context.Set().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( item => item.ID, model.ID ); this.DbContext.UpdateProperty(entity, item => item.Name, model.Name); 

您可以这样做(您可能应该拥有所有测试过程数据):

 TestProcess pr = new TestProcess(); pr.Id = id; pr.UpdateID = updateID; context.Attach(pr); context.ObjectStateManager.ChangeObjectState(pr, EntityState.Modified); context.SaveChanges(); 

代码:

 TestProcess testprocess = dbcontext.TestProcesses.Attach(new TestProcess { MyID = id }); tp.UpdateID = updateID; dbcontext.Entry(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 

注意:

需要“IsModified = true”行,因为在创建新的TestProcess对象时(仅填充了MyID属性),所有其他属性都具有其默认值(0,null等)。 如果要使用“默认值”更新数据库,entity framework将不会检测到更改,然后不会更新数据库。

例如:

 testprocess.UpdateID = null; 

如果没有“IsModified = true”这一行将无法工作,因为属性UpdateID在创建空的TestProcess对象时已经为空,您需要向EF说这个列必须更新,这就是这一行的目的。