Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体FW web服务将未公开的字段更新为null_.net_Web Services_Entity Framework_Entity - Fatal编程技术网

.net 实体FW web服务将未公开的字段更新为null

.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 _

我有一个从JavaScript调用的web服务。JS传递一个对象,该对象稍后将转换为服务器中的实体对象。问题是实体中有一些字段在传递的JSON中不存在。这些不存在的字段在数据库中更新为空值

例如,您有一个带有密码字段的客户表。密码未公开且未从web服务对象检索。但当我更新客户行密码时,密码设置为null。有没有办法告诉EF不要更改密码字段

我本可以手动复制字段,但我正在尝试制作一个网页,自动保存我想要的字段。这里有一些代码。T是实体类的泛型

    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中才能还原属性修改。