Необходимо вызвать хранимые процедуры внутри объекта - PullRequest
0 голосов
/ 02 марта 2011

У меня есть эта открытая операция в моем сервисе:

    void IApplicationService.DeleteApplication(int id)
    {
        var repository = UnitOfWork.CreateRepository<Application>();

        var application = repository.GetByKey(id);
        OnCommit.Run(() => DeleteInvitations(id)); // ouch!!
        repository.Delete(application);
    }

OnCommit.Run () планирует действие, которое будет выполняться при вызове SaveChanges (), реализованное в инспекторе WCF.DeleteInvitations имеет доступ к контексту объекта и вызывает хранимую процедуру для удаления каждого элемента в приложении коллекции. Приглашения.Я сделал так, чтобы не загружать все приглашения в память, а только удалить их на следующем шаге.Мой Repository.Delete (), в свою очередь, вызывает Delete () в сущности.

Но мне не очень нравится, когда часть удаления обрабатывается сервисным кодом.Мне нужно иметь доступ к хранимым процедурам внутри моих сущностей.

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

    public void Delete()
    {
        Contract.Requires(EntityState == System.Data.EntityState.Unchanged);

        if (Responses.Any())
            throw new ValidationException("There are responses.");

        // *..* relationship, just break that
        for (int i = Forms.Count - 1; i >= 0; i--)
        {
            var form = Forms.ElementAt(i);
            Forms.Remove(form);
        }

        // I could have something like this, perhaps?
        StoredProcedures.Call("DeleteInvitations", this.Id);
    }

Что вы думаете об этом?Любые предложения?

Некоторые требования, которые я поставил:

  • Сервисный код должен вызывать только методы хранилища и сущности
  • Репозиторий должен быть общим
  • Сущности не должны иметь доступа к контексту объекта

1 Ответ

0 голосов
/ 02 марта 2011

Я не вижу проблемы, не могли бы вы объяснить, что вы хотите сделать.

Вы можете добавить хранимые процедуры в вашу модель сущности и вызывать ее, как любой другой метод или / и вы можете вызывать процедурунапример:

string sp = "Entities.StoredProcedureName";
var conn = (EntityConnection)dbContext.Connection;
conn.Open();
EntityCommand cmd = new EntityCommand(sp, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("Parameter1", [type]).Value = paramvalue;
cmd.ExecuteNonQuery();

Вы можете сделать это выполнение универсальным, если хотите, и динамически передавать имя и параметры хранимой процедуры.

Надеюсь, я понимаю, что вы хотите.

...