.net 实体FW web服务将未公开的字段更新为null
我有一个从JavaScript调用的web服务。JS传递一个对象,该对象稍后将转换为服务器中的实体对象。问题是实体中有一些字段在传递的JSON中不存在。这些不存在的字段在数据库中更新为空值 例如,您有一个带有密码字段的客户表。密码未公开且未从web服务对象检索。但当我更新客户行密码时,密码设置为null。有没有办法告诉EF不要更改密码字段 我本可以手动复制字段,但我正在尝试制作一个网页,自动保存我想要的字段。这里有一些代码。T是实体类的泛型.net 实体FW web服务将未公开的字段更新为null,.net,web-services,entity-framework,entity,.net,Web Services,Entity Framework,Entity,我有一个从JavaScript调用的web服务。JS传递一个对象,该对象稍后将转换为服务器中的实体对象。问题是实体中有一些字段在传递的JSON中不存在。这些不存在的字段在数据库中更新为空值 例如,您有一个带有密码字段的客户表。密码未公开且未从web服务对象检索。但当我更新客户行密码时,密码设置为null。有没有办法告诉EF不要更改密码字段 我本可以手动复制字段,但我正在尝试制作一个网页,自动保存我想要的字段。这里有一些代码。T是实体类的泛型 private ObjectContext _
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);
}
}
private ObjectContext\u context;
私有IObjectSet\u对象集;
受保护的抽象ObjectContext getObjectContext();
私有ObjectContext prepareObjectContext()
{
_context=getObjectContext();
_objectSet=_context.CreateObjectSet();
返回上下文;
}
[HttpPost]
公共覆盖操作结果保存(保存数据)
{
使用(ObjectContext oc=prepareObjectContext())
{
如果(data.inserted!=null&&data.inserted.Count>0)
{
foreach(插入数据中的T行)
{
_objectSet.AddObject(行);
_context.ObjectStateManager.ChangeObjectState(行,System.Data.EntityState.Add);
}
}
如果(data.updated!=null&&data.updated.Count>0)
{
foreach(数据中的T行。已更新)
{
_objectSet.Attach(行);
_context.ObjectStateManager.ChangeObjectState(行,System.Data.EntityState.Modified);
}
}
如果(data.deleted!=null&&data.deleted.Count>0)
{
foreach(数据中的T行。已删除)
{
_objectSet.Attach(行);
_objectSet.DeleteObject(行);
_context.ObjectStateManager.ChangeObjectState(行、系统.Data.EntityState.Deleted);
}
}
oc.SaveChanges();
//CMManagement.Models.CMEntities
ViewBag.columns=列;
返回Json(false);
}
}
如果附加实体并将其状态设置为“已修改”,则所有字段都将更新。原因是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);
}
}
}
谢谢你的回答。在插入表时,我还需要将一些字段设置为未修改。不幸的是,没有未修改的方法。是否有任何可能的解决方法?只有在.NET 4.5中才能还原属性修改。