Есть ли в Entity Framework держатель объекта обновления? - PullRequest
1 голос
/ 09 ноября 2010

Я сейчас вставляю / обновляю поля вроде этого (если есть лучший способ, пожалуйста, так и говорим - мы всегда учимся)

public void UpdateChallengeAnswers(List<ChallengeAnswerInfo> model, Decimal field_id, Decimal loggedUserId)
{
    JK_ChallengeAnswers o;
    foreach (ChallengeAnswerInfo a in model)
    {
        o = this.FindChallengeAnswerById(a.ChallengeAnswerId);
        if (o == null) o = new JK_ChallengeAnswers();

        o.answer = FilterString(a.Answer);
        o.correct = a.Correct;
        o.link_text = "";
        o.link_url = "";
        o.position = FilterInt(a.Position);

        o.updated_user = loggedUserId;
        o.updated_date = DateTime.UtcNow;

        if (o.challenge_id == 0)
        {
            // New record
            o.challenge_id = field_id;  // FK
            o.created_user = loggedUserId;
            o.created_date = DateTime.UtcNow;

            db.JK_ChallengeAnswers.AddObject(o);
        }
        else
        {
            // Update record
            this.Save();
        }
    }

    this.Save(); // Commit changes
}

Как вы можете видеть есть 2 раза this.Save() (ведьма вызывает db.SaveChanges();)

, когда При добавлении мы помещаем новый объект в Place Holder с помощьюAddObject метод, другими словами, новый объект не фиксируется сразу, и мы можем разместить столько объектов, сколько мы хотим.

Но когда это обновление, мне нужно сначала сохранить, прежде чем перейти к следующемуобъект, есть ли метод, который я могу использовать для, скажем,

        if (o.challenge_id == 0)
        {
            // New record
            o.challenge_id = field_id;
            o.created_user = loggedUserId;
            o.created_date = DateTime.UtcNow;

            db.JK_ChallengeAnswers.AddObject(o);
        }
        else
        {
            // Update record
            db.JK_ChallengeAnswers.RetainObject(o);
        }
    }

    this.Save(); // Only save once when all objects are ready to commit
}

Так что, если есть 5 обновлений, мне не нужно сохранять в базу данных 5 раз , но только один раз в конце.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Взято из Стартового комплекта информации о сотрудниках , вы можете рассмотреть фрагмент кода, как показано ниже:

public void UpdateEmployee(Employee updatedEmployee)
        {
            //attaching and making ready for parsistance
            if (updatedEmployee.EntityState == EntityState.Detached)
                _DatabaseContext.Employees.Attach(updatedEmployee);
            _DatabaseContext.ObjectStateManager.ChangeObjectState(updatedEmployee, System.Data.EntityState.Modified);
            _DatabaseContext.SaveChanges();
        }
2 голосов
/ 09 ноября 2010

Хорошо, если у вас есть объект, который прикреплен к графику, если вы измените значения этого объекта, тогда объект будет помечен как Изменено .

Если вы просто сделаете .AddObject, то сущность будет помечена как Добавлено .

Пока ничего не произошло - только постановка графика.

Затем , когда вы выполните SaveChanges(), EF преобразует записи в OSM в соответствующие запросы хранилища.

Ваш код выглядит немного странно. Вы отладили (и запустили трассировку SQL), чтобы увидеть, что на самом деле выполняется? Потому что я не понимаю, зачем вам этот первый .Save, потому что он соответствует моим указанным выше пунктам, так как вы изменяете сущности в первых нескольких строках метода, оператор UPDATE, скорее всего, всегда получит выполняется независимо от идентификатора.

Я предлагаю вам реорганизовать ваш код для обработки нового / измененного в отдельном методе. (в идеале через репозиторий)

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