我有一个从JavaScript调用的Web服务。 JS传递一个对象,该对象稍后被转换为服务器中的Entity对象。问题是实体中有些字段在传递的JSON中不存在。这些非当前字段在DB中更新为空值。
例如,您有一个带有密码字段的Customer表。密码未公开,也未从Web服务对象检索。但是当我更新Customer行时,Password被设置为null。有没有办法告诉EF不要更改密码字段?
我本可以手动复制字段,但我正在尝试创建一个自动保存我想要的字段的网页。这是使用的一些代码。 T对于Entity类是通用的。
private ObjectContext _context;
private IObjectSet<T> _objectSet;
protected abstract ObjectContext getObjectContext();
private ObjectContext prepareObjectContext()
{
_context = getObjectContext();
_objectSet = _context.CreateObjectSet<T>();
return _context;
}
[HttpPost]
public override ActionResult Save(SavedData data)
{
using (ObjectContext oc = prepareObjectContext())
{
if (data.inserted != null && data.inserted.Count > 0)
{
foreach (T row in data.inserted)
{
_objectSet.AddObject(row);
_context.ObjectStateManager.ChangeObjectState(row, System.Data.EntityState.Added);
}
}
if (data.updated != null && data.updated.Count > 0)
{
foreach (T row in data.updated)
{
_objectSet.Attach(row);
_context.ObjectStateManager.ChangeObjectState(row, System.Data.EntityState.Modified);
}
}
if (data.deleted != null && data.deleted.Count > 0)
{
foreach (T row in data.deleted)
{
_objectSet.Attach(row);
_objectSet.DeleteObject(row);
_context.ObjectStateManager.ChangeObjectState(row, System.Data.EntityState.Deleted);
}
}
oc.SaveChanges();
//CMManagement.Models.CMEntities
ViewBag.columns = Columns;
return Json(false);
}
}
答案 0 :(得分:1)
如果附加实体并将其状态设置为已修改,则将更新所有字段。原因是EF不知道哪些字段确实发生了变化。如果您的网页仅发布字段子集,则必须明确告知EF您要更新的字段:
if (data.updated != null && data.updated.Count > 0) {
foreach (T row in data.updated) {
_objectSet.Attach(row);
var entry = _context.ObjectStateManager.GetObjectStateEntry(row);
foreach (string property in PropertiesToBeUpdated) {
entry.SetModifiedProperty(property);
}
}
}