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

时间:2013-01-28 16:34:25

标签: .net web-services entity-framework entity

我有一个从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);
        }
    }

1 个答案:

答案 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);
        }
    }
}