【问题标题】:Is there a more cleaner or elegant way to pass multiple parameters to SQL stored procedure using Entity Framework?是否有更简洁或优雅的方式使用实体框架将多个参数传递给 SQL 存储过程?
【发布时间】:2015-07-17 21:17:32
【问题描述】:

现在我正在使用 Entity Framework 将多个参数传递给一个存储过程,它看起来像这样..

public long AddDealer(Dealer dealer)
    {
        return Convert.ToInt32(AWJE.Database.SqlQuery<Dealer>(
            "usp_InsertDealer @Name, @Description",
            new SqlParameter("@DealerID", dealer.DealerID).Value,
            new SqlParameter("@Name", dealer.Name),
            new SqlParameter("@Description", dealer.Description)
            ));
    }

是否有更优雅或更简洁的方式来传递多个参数,而不是显示的方式?如果我遇到其他需要传递更多参数的存储过程,那么这种方式看起来会很快变得混乱。

【问题讨论】:

  • 您是先使用代码还是生成了 edmx?我知道过去我在我的 edmx 中添加了一个存储过程,然后能够像调用函数一样调用它。 msdn.microsoft.com/en-us/library/vstudio/…
  • @kmacdonald,我在SSMS中编写了存储过程和表,然后从数据库中生成。
  • 我不知道 usp_InsertAddress 究竟做了什么,但在我看来,您可以只使用一个实体并将其添加到上下文和 SaveChanges() 或者,如果您需要使用存储CUD 操作的 procs,相应地映射存储的 procs。 EF 也会尝试将存储过程的结果具体化为 IEnumerable&lt;Address&gt;,所以我不太确定 Convert.ToInt32() 应该如何在这里工作。
  • @Pawel,我注意到我写的内容存在缺陷。我还没有能够测试任何东西,因为我有更多的方法要写。 usp_InsertAddress 是一个 crud 操作并返回新 ID,这就是为什么我让它将返回值转换为 Int32,这是错误的,这将是我的下一个问题,因为我有点改变了方法。我要做的是使用更新版本来编辑该方法,以了解我认为如何获取返回的 ID

标签: c# asp.net entity-framework stored-procedures


【解决方案1】:

您的代码示例显然不是一个工作示例:

  1. 我不明白如何将Dealer 类型的对象转换为int
  2. 如果您的方法预期返回long,那么为什么要将存储过程的结果转换为int
  3. 您正在传递 @DealerID 参数,但它不是 SP 调用的一部分。
  4. 不知道为什么其中一个SqlParameters 调用.Value 添加到它。

所以,让我调整一下,假设你的出发点是这样的:

public long AddDealer(Dealer dealer)
{
    return AWJE.Database.SqlQuery<Dealer>(
        "usp_InsertDealer @Name, @Description",
        new SqlParameter("@Name", dealer.Name),
        new SqlParameter("@Description", dealer.Description)
        ).DealerID;
}

或者您可能决定 SP 直接返回 long,如下所示:

public long AddDealer(Dealer dealer)
{
    return AWJE.Database.SqlQuery<long>(
        "usp_InsertDealer @Name, @Description",
        new SqlParameter("@Name", dealer.Name),
        new SqlParameter("@Description", dealer.Description)
        );
}

无论哪种方式,我看到的唯一简化是您可以将调用更改为SqlQuery,以便使用位置参数而不是命名参数。进行该更改允许您放弃创建显式 SqlParameter 实例。然后可以将调用简化为:

public long AddDealer(Dealer dealer)
{
    return AWJE.Database.SqlQuery<long>(
        "usp_InsertDealer @Name, @Description",
        dealer.Name,
        dealer.Description
        );
}

...您如何命名@Name@Description 不再重要,但您必须确保以正确的顺序传入参数值。

除此之外,我不知道你能让这个更干净或更优雅。

【讨论】:

  • 谢谢你的澄清,你是对的,这不是一个有效的例子,因为我没有机会测试,因为我还有更多的东西要写测试后者,所以我很欣赏这个修复。那么前两个代码块中的任何一个都会给我存储过程的返回ID?并且仅仅能够删除命名参数并使用位置参数肯定已经清理了更多。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多