0

JavaScript から呼び出される Web サービスがあります。JS は、後でサーバー内の Entity オブジェクトにキャストされるオブジェクトを渡します。問題は、渡された JSON に存在しないフィールドがエンティティにあることです。これらの存在しないフィールドは、DB で null 値に更新されます。

たとえば、Password フィールドを持つ Customer テーブルがあるとします。パスワードは公開されず、Web サービス オブジェクトから取得されません。しかし、Customer 行を更新すると、パスワードが null に設定されます。Password フィールドを変更しないように EF に指示する方法はありますか?

フィールドを手動でコピーすることもできましたが、必要なフィールドを自動的に保存する Web ページを作成しようとしています。使用されるコードの一部を次に示します。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);
        }
    }
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 に答える