Как использовать обновление SPROC в Entity Framework 4.1 - PullRequest
0 голосов
/ 05 октября 2011

Справочная информация. Первоначально я создал приложение на MVC3 и Entity Framework 4.1 (база данных первая и сгенерированный DBContext).Я следовал шаблону репозитория.Чтобы соответствовать требованиям DBA корпорации, мне нужно преобразовать весь доступ к данным в использование только SPROCS для продвижения базы данных.Я застрял на нескольких вещах, на которые я надеюсь получить ответы ...

  • Функции вставки / удаления / обновления

Я создал свойВставка, удаление и обновление функций.Я добавил их в свою модель EDM и заполнил их на вкладке «Сопоставить сущность с функциями» в деталях сопоставления для соответствующей сущности.Из того, что я прочитал, у меня не должно быть изменений кода в моем классе репозитория.Это правильно?(Код ниже)

    public void CreateReplacementReason (ReplacementReason replacementreason)
    {
        _db.ReplacementReasons.Add(replacementreason);
    }

    public void UpdateReplacementReason(ReplacementReason replacementreason)
    {
        var rr = FetchReplacementReason(replacementreason.PK_ReplacementReasonId);
        rr.DF_IsActive = replacementreason.DF_IsActive;
        rr.ReplacementReasonDesc = replacementreason.ReplacementReasonDesc;
    }
  • Возвращение Scope_Identity ()

Как должен выглядеть метод create в моем классе репозитория, который вызывает SPROC, для которого есть возвращаемое значение (scope_identity)?Я думал, что мог бы поместить оператор возврата в мой текущий метод и изменить тип возврата.Это, конечно, не сработало.

public int CreateReplacementReason (ReplacementReason replacementreason)
    {
        return _db.ReplacementReasons.Add(replacementreason);
    }

И это SPROC, который вызывается после обновления, чтобы вернуть Scope_Identity ()

    INSERT INTO [dbo].[ReplacementReason] ([ReplacementReasonDesc], [DF_IsActive], [CreatedDateTime])
SELECT @ReplacementReasonDesc, @DF_IsActive, @CreatedDateTime

SELECT  SCOPE_IDENTITY() AS Id

Любая любая любая помощь будетоценили.

1 Ответ

0 голосов
/ 05 октября 2011

Он не работает, потому что метод Add ничего не сохраняет в базе данных, поэтому он не может вернуть идентификатор, созданный в базе данных. Идентификатор будет указан в вашем ReplacementReason непосредственно после того, как вы позвоните SaveChanges в своем контексте.

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

public int CreateReplacementReason (ReplacementReason replacementReason)
{
    _db.ReplacementReasons.Add(replacementReason);
    _db.SaveChanges();
    return replacementReason.Id;
}

Но в большинстве случаев это не то, что вам нужно, потому что вы хотите сохранить все изменения вместе и не выполнять SaveChanges после каждой модификации данных.

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