EF SaveChanges отклоняет изменения при изменении сущности через событие ObjectContext.SaveChanges - PullRequest
0 голосов
/ 31 мая 2019

Сначала я работаю с кодом EF 6.0.Я использую ObjectContext, чтобы определить, когда SaveChanges вызывается.В этом обработчике я пытаюсь установить пользовательские свойства объекта для некоторых конкретных значений.Все работает нормально, данные, измененные в обработчике, передаются в базу данных, но проблема в том, что измененный объект Entity возвращается в свое прежнее состояние после выполнения SaveChanges.

Вот некоторый код:

Во-первых, у меня есть базовый класс, который используется в качестве родителя во всех областях:

    public class MyBaseEntity
    {
       public int UserID { get; set; }
    }

В моем DbContext я подписан на событие SaveChanges:

    void ObjectContext_SavingChanges(object sender, EventArgs e)
    {
        var context = sender as ObjectContext;

        if (context != null)
        {
            context.ObjectStateManager
                .GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                .Foreach(p =>
                {
                    // update the UserID with the current user ID that is provided
                    // through a construct for our DbContext
                    (p.Entity as MyBaseEntity).UserID = CurrentUserID
                });
        }
    }

И теперь, когда я вызываю SaveChanges, происходит следующее:

    var entity = new MyEntity();
    entity.Name = "test";

    // entity.UserID == 0 -> true
    // before the save, entity.UserID will be 0 (default value)
    context.SaveChanges();
    // entity.UserID == 0 -> true
    // after the save it will be again zero, although it was
    // changed during ObjectContext.SaveChanges handler
    // expected value would be entity.UserID = 102 (in case when global CurrentUserID is 102)

После вызова SaveChanges будет вызван обработчик события, и в базу данных будет вставлен правильный UserID, но после выполнения SaveChanges UserIDбудет возвращено к своему первоначальному значению.

Итак, это ошибка, или дизайн, и что такое обходной путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...