ef更新字段的方式有两种:
1.就是把实体直接查询出来修改部分字段,在附加到ef上,如下:
using (ZDPORTALEntities1 db = new ZDPORTALEntities1())
{
News n = db.News.FirstOrDefault();
if (n != null)
{
n.N_Title = "C#简介";
db.Set<News>().Attach(n);
db.Entry<News>(n).State = EntityState.Modified;
db.SaveChanges();
}
}
这是比较常见的修改方式,但是有个缺点,每次修改实体的时候都要查一遍数据库,麻烦不说,影响执行速度。
2.不需要先把数据查询出来,但是要制定主键列标识的属性名称,这里有两种方法,如下:
方法一:
using (ZDPORTALEntities1 db = new ZDPORTALEntities1())
{
News news = new News() { N_ID = Guid.Parse("c3967fb9-cdb5-4ba0-b463-e7c7a2b73d20"), N_Title="C#简介132" };
DbEntityEntry<News> entry = db.Entry<News>(news);
entry.State = EntityState.Unchanged;
entry.Property(t => t.N_Title).IsModified = true; //设置要更新的属性
db.SaveChanges();
}
还有一种方法如下:
using (ZDPORTALEntities1 db = new ZDPORTALEntities1())
{
News news = new News() { N_ID = Guid.Parse("c3967fb9-cdb5-4ba0-b463-e7c7a2b73d20"), N_Title="C#简介132" };
db.News.Attach(news);
var stateEntry = ((IObjectContextAdapter)db).ObjectContext.
ObjectStateManager.GetObjectStateEntry(news);
stateEntry.SetModifiedProperty("N_Title");
db.SaveChanges();
}
可以封装一下,进行复用:
/// <summary>
/// 更新指定字段
/// </summary>
/// <param name="entity">实体</param>
/// <param name="fileds">更新字段数组</param>
public void UpdateEntityFields(T entity, List<string> fileds)
{
if (entity != null&&fileds!=null)
{
dbContext.Set<T>().Attach(entity);
var SetEntry = ((IObjectContextAdapter)dbContext).ObjectContext.
ObjectStateManager.GetObjectStateEntry(entity);
foreach (var t in fileds)
{
SetEntry.SetModifiedProperty(t);
}
dbContext.SaveChanges();
}
}