急!!!关于Entity Framework更新表部分字段问题 本帖最后由 jls 于 2013-10-07 17:54:41 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 其实更新部分字段的sql语句,是一种语法糖。本质上,更新数据库的数据,无论你是指定了一个字段,还是所有的字段,都是完整的更新(有的数据库系统内部干脆是删除/插入操作代替更新)。 所以,EF转换为完全更新的sql既不会影响性能,也不会改变程序的运行结果,你完全不用担心。 这个表数据量巨大,在这个表下还有触发器,在触发器中,通过监视哪些字段是否更新来触发,所以,如果能够做到转换成的SQL语句如果能做到部分更新,对性能上来说,影响是很大的! public void Update<TEntity>(TEntity entity, string[] properties) where TEntity : class { var entry = base.Entry(entity); if (entry.State == EntityState.Detached) { this.Set<TEntity>().Attach(entity); } foreach (var propertyName in properties) { entry.Property(propertyName).IsModified = true; } } KarasCanvas:我的实体类Opr_Pro_Work不是继承自EntityObject类,Property属性是EntityObject类的吧? 先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了! //注释下面这句,db.Entry(w1).State = EntityState.Modified;然后生成的SQL,就是只更新字段的SQL语句。 xml111024的说法是正确的,但这有一个前提就是using (JLSContext db = JLSDBContextManager.GenerateJLSContext()){ Opr_Pro_Work w1=db.Opr_Pro_Work.Where(it=>it.WorkID==1).FirstOrDefault(); w1.IsPrint = true; //w1必须是经过db查询得出的实体变量 db.SaveChanges();}using (JLSContext db = JLSDBContextManager.GenerateJLSContext()) { w1.IsPrint = false; //如果w1是在创建db前已经存在的,这样就在SaveChanges()的时候不会生成SQL语句 db.SaveChanges(); } 先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!这个是DbContext派生类中的方法,适合EF5+ 先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!这个是DbContext派生类中的方法,适合EF5+唉,我使用的是EF4.4,可惜,没有这个方法 搞定了,现贴上代码与大家分享:using (JLSContext db = JLSDBContextManager.GenerateJLSContext()){ db.Set<Opr_Pro_Work>().Attach(work); work.IsPrint = false; db.SaveChanges();}//这样生成的updateSQL语句如下exec sp_executesql N'update [dbo].[Opr_Pro_Work]set [IsPrint] = @0where ([WorkID] = @1)',N'@0 bit,@1 bigint',@0=0,@1=103 消息 208,级别 16,状态 6,过程 sele,第 22 行 对象名 'dbo.sele' 无效。 请问如何用数据库数据填充gridcontrol的表格? web.config中动态修改authorization节点 .Net中如何实现UDP的多路广播组的发送和接收 请人详解FrameDimensionsList属性 ??????与学习无关的问题??????? 正则怎么写 vs tools for office system 请教:程序打包安装后,执行时总是有CLR抛出异常? c#一个问题在线等! 请问C#如何做到:让控件的坐标,随着窗体的大小变化而改变 如何用正则表达式获取
{
var entry = base.Entry(entity);
if (entry.State == EntityState.Detached)
{
this.Set<TEntity>().Attach(entity);
}
foreach (var propertyName in properties)
{
entry.Property(propertyName).IsModified = true;
}
}
我的实体类Opr_Pro_Work不是继承自EntityObject类,Property属性是EntityObject类的吧?
先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!
db.Entry(w1).State = EntityState.Modified;然后生成的SQL,就是只更新字段的SQL语句。
using (JLSContext db = JLSDBContextManager.GenerateJLSContext())
{
Opr_Pro_Work w1=db.Opr_Pro_Work.Where(it=>it.WorkID==1).FirstOrDefault();
w1.IsPrint = true; //w1必须是经过db查询得出的实体变量
db.SaveChanges();
}
using (JLSContext db = JLSDBContextManager.GenerateJLSContext())
{
w1.IsPrint = false; //如果w1是在创建db前已经存在的,这样就在SaveChanges()的时候不会生成SQL语句
db.SaveChanges();
}
先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!
这个是DbContext派生类中的方法,适合EF5+
先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!
这个是DbContext派生类中的方法,适合EF5+唉,我使用的是EF4.4,可惜,没有这个方法
{
db.Set<Opr_Pro_Work>().Attach(work);
work.IsPrint = false;
db.SaveChanges();
}
//这样生成的updateSQL语句如下
exec sp_executesql N'update [dbo].[Opr_Pro_Work]
set [IsPrint] = @0
where ([WorkID] = @1)
',N'@0 bit,@1 bigint',@0=0,@1=103