0

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

例如,您有一个带有密码字段的客户表。密码未公开,也未从 Web 服务对象中检索。但是当我更新客户行密码设置为空。有没有办法告诉 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);
        }
    }
4

1 回答 1

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);
        }
    }
}
于 2013-01-28T18:07:38.677 回答