【问题标题】:Need to call stored procedures inside an entity需要调用实体内部的存储过程
【发布时间】:2011-03-02 18:20:56
【问题描述】:

我的服务中有这个公共操作:

    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 可以访问对象上下文并调用存储过程来删除集合 application.Invitations 中的每个项目。我这样做是为了避免将所有邀请加载到内存中,只是为了在下一步中删除它们。我的 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);
    }

你对此有何感想?有什么建议吗?

我提出的一些要求:

  • 服务代码只能调用存储库和实体方法
  • 存储库应该是通用的
  • 实体不得访问对象上下文

【问题讨论】:

    标签: c# stored-procedures domain-driven-design repository entity


    【解决方案1】:

    我没有看到问题,请你解释一下你想要做什么。

    您可以将存储过程添加到您的实体模型中,并像任何其他方法一样调用它或/并且您可以像这样调用过程:

    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();
    

    如果需要,您可以使此执行通用化并动态传递存储过程名称和参数。

    我希望我明白你想要什么。

    【讨论】:

    • 这样我必须让实体知道EF的ObjectContext。你能给我指出如何避免它的任何参考吗?
    • 我不明白你到底想要什么。是否要使用 EF 调用存储过程?
    • 您可以使用例如企业库来创建通用存储过程执行,并且只需要上下文来获得连接。
    • 是的,可以使用 EF 或任何使用与我的 ObjectContext 相同的事务调用存储过程。当我说“实体不得访问对象上下文”时,我不是很清楚吗?
    • 然后尝试使用 EntLib 调用过程并为此创建存储库,只需使用对象上下文中的连接和事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多