ef怎么实现只更新指定字段?

lyiverson 2012-07-02 05:46:12
我在网上找了个EF的EntityRepository,自己改了改,在实际使用中发现,不能更新指定的字段,我想自己写一个方法,但总是报错。刚学EF请大能之士,帮我看看。指点一二呀。
这是我的代码,最后一个方法是我写的方法,总是报错。

namespace Model.EF
{
public class EntityRepository<TEntity> : IRepository<TEntity>
where TEntity : class, IEntity
{
private readonly NerdDinners m_dbContext;
private ObjectContext context;
public EntityRepository()
{
m_dbContext =new NerdDinners();
}

protected virtual void OnLoaded(TEntity entity)
{

}

protected DbSet<TEntity> DbSet
{
get { return m_dbContext.Set<TEntity>(); }
}

public IEnumerable<TEntity> FindAll()
{
return DbSet;
}
public List<TEntity> FindBy(string where)
{

var list = DbSet.SqlQuery(where);
return list.ToList();
}
public List<TEntity> FindPageList(string where, int pageIndex, int pageSize, out int totalRecord)
{
totalRecord = 0;

var list = DbSet.SqlQuery(where).Skip((pageIndex - 1) * pageSize).Take(pageSize);
totalRecord = DbSet.SqlQuery(where).Count();
return list.ToList();
}

public TEntity FindById(int id)
{
return DbSet.SingleOrDefault(entity => entity.ID== id);
}

public void Add(TEntity entity)
{

DbSet.Add(entity);
m_dbContext.SaveChanges();
}

public void Delete(TEntity entity)
{
var entry = m_dbContext.Entry(entity);
if (entry.State == EntityState.Detached)
{

//DbSet.Attach(entity);
entry.State = EntityState.Deleted;
//var entityToUpdate = FindById(entity.Id);
//EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<TEntity, TEntity>().Map(entity, entityToUpdate);
}
m_dbContext.SaveChanges();
}

public void Update(TEntity entity)
{

var entry = m_dbContext.Entry(entity);

if (entry.State == EntityState.Detached)
{
//DbSet.Attach(entity);
entry.State = EntityState.Modified;
//var entityToUpdate = FindById(entity.Id);
//EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<TEntity, TEntity>().Map(entity, entityToUpdate);

}

m_dbContext.SaveChanges();
}
public void Update(TEntity entity, params string[] fileds)
{
var entry = m_dbContext.Entry(entity);

Type Ttype = typeof(TEntity);


var entityToUpdate = FindById(entity.ID);
context.AttachTo(Ttype.Name, entityToUpdate);
var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);

for (int i = 0; i < fileds.Length - 1; i++)
{
stateEntry.SetModifiedProperty(fileds[i]);
}


m_dbContext.SaveChanges();
}
}
...全文
3725 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhengqin 2013-01-06
  • 打赏
  • 举报
回复
public int Update(InfoPatent model, string[] arr) { db.InfoPatent.Attach(model); var stateEntry = db.ObjectStateManager.GetObjectStateEntry(model); stateEntry.SetModified(); foreach (string item in arr) stateEntry.SetModifiedProperty(item); return db.SaveChanges(); } arr 就是你需要更新的字段,调用如下: Update(model,new string{"a字段","b字段"})
lyh2ysy 2012-10-24
  • 打赏
  • 举报
回复
最近学着做的一个例子,按需更新

OrderDBEntities _db = new OrderDBEntities();

public t_Customer Create_t_Customer()
{
t_Customer cust = new t_Customer()
{
f_CustomerID = 1,
f_Email = "sidecore.qq.com",
f_Tel = "02022222222",

};

return cust;
}

public void ModifyCust3(t_Customer cust)
{
_db.t_Customer.Attach(cust);
ObjectStateEntry ose = _db.ObjectStateManager.GetObjectStateEntry(cust);
ose.SetModified();
ose.SetModifiedProperty("f_Email");
ose.SetModifiedProperty("f_Tel");
_db.SaveChanges();
}

//测试该方法,修改客户ID为1的客户的电话号码和邮箱地址
public void 练习3_7_3()
{
ModifyCust3(Create_t_Customer());
}
weizengxun 2012-09-10
  • 打赏
  • 举报
回复
没更新都查询一次太不科学了。EF本身就带有按需更新。

[HttpPost]
public ActionResult Index(jway_category model) {
var entity = new jway_category();
entity.Id = 1;
//ViewBag.Message = user.GetName();
using (var db = new jwaycmsContext()) {
try {
db.jway_category.Attach(entity);
entity.Title = model.Title;
db.SaveChanges();
return RedirectToAction("Index");
} catch (Exception ex) {
var t = ex.InnerException;
throw new Exception();
}
}
}
村长_乐 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

只需要将更新的字段附上新值.
C# code

#region 修改客户信息
T_Company t_company = EF.T_Company.Where(a => a.ID == id).SingleOrDefault();
if (t_company != null)
……
[/Quote]

这个是对的
杰拉尔 2012-08-31
  • 打赏
  • 举报
回复
通用类没这么智能我也试过已放弃了
手动来写
var entityToUpdate = FindById(entity.Id); ;
entityToUpdate=xx.id;



特殊的 更新和删除大多还是用SQL语句处理比较好 EF就不支持批量删除只能FOREACH性能极差。

[Quote=引用楼主 的回复:]
我在网上找了个EF的EntityRepository,自己改了改,在实际使用中发现,不能更新指定的字段,我想自己写一个方法,但总是报错。刚学EF请大能之士,帮我看看。指点一二呀。
这是我的代码,最后一个方法是我写的方法,总是报错。
C# code

namespace Model.EF
{
public class EntityRepository<TEntity> : IRepos……
[/Quote]
xushungzf 2012-08-30
  • 打赏
  • 举报
回复
context.People.MergeOption = System.Data.Objects.MergeOption.NoTracking;

百度下这个 NoTracking,希望对你有用!
dsclub 2012-07-18
  • 打赏
  • 举报
回复
你的Update(TEntity entity)方法不是已经可以达到要求了么?

你自己遍历一遍字段设定Modified状态会比EF框架的更有效率么?
dsclub 2012-07-18
  • 打赏
  • 举报
回复
为什么要更新指定的字段?
timfeng2009 2012-07-16
  • 打赏
  • 举报
回复

//取得模型,循环属性,按需更新
public virtual void Update(T t)
{
var model= this.GetModel(t);
foreach (System.Reflection.PropertyInfo item in t.GetType().GetProperties()
.Where(p => p.CanRead&&p.CanWrite&&p.GetCustomAttributes(typeof(DataMemberAttribute), false).Length > 0))
{
string name = item.Name;
object value = item.GetValue(t,null);
//判断属性为值类型或是字符串类型
if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))
{
item.SetValue(model, value,null);
}
}
DB.SaveChanges();
}
  • 打赏
  • 举报
回复
先 查出你要更新的实体 var result=Db.表

result.字段=要更新的值
Db.SaveChanges();


大致就是这样的, 我也是新手 我就是这么写的
瑞卡哥哥 2012-07-09
  • 打赏
  • 举报
回复
你可以先查询出来 modle 再修改modle的值 然后savechange()
wlf535944903 2012-07-06
  • 打赏
  • 举报
回复
按需更新

希望对你有帮助
  • 打赏
  • 举报
回复
只需要将更新的字段附上新值.

#region 修改客户信息
T_Company t_company = EF.T_Company.Where(a => a.ID == id).SingleOrDefault();
if (t_company != null)
{
t_company.Name = cm.Name;
t_company.Address = cm.Address;
t_company.ZipCode = cm.ZipCode;
t_company.Province_ID = cm.Province_ID;
t_company.City_ID = cm.City_ID;
t_company.UpdateTime = DateTime.Now;
t_company.UpdateUser_id = UserInfo.UserID;
EF.SaveChanges();
AddLog("修改", "公司ID:" + t_company.ID.ToString());
}
lyiverson 2012-07-05
  • 打赏
  • 举报
回复
没人吗?有人给指点一二么
lyiverson 2012-07-02
  • 打赏
  • 举报
回复
怎么写呀,求教。[Quote=引用 2 楼 的回复:]

where 关键字
[/Quote]
a1107151332 2012-07-02
  • 打赏
  • 举报
回复
where 关键字
dopsop110 2012-07-02
  • 打赏
  • 举报
回复
没用过ef

8,494

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧