C# 使用实体框架向SQL存储过程传递多个参数是否有更干净或优雅的方法?
现在,我正在使用Entity Framework将多个参数传递给一个存储过程,如下所示C# 使用实体框架向SQL存储过程传递多个参数是否有更干净或优雅的方法?,c#,asp.net,entity-framework,stored-procedures,C#,Asp.net,Entity Framework,Stored Procedures,现在,我正在使用Entity Framework将多个参数传递给一个存储过程,如下所示 public long AddDealer(Dealer dealer) { return Convert.ToInt32(AWJE.Database.SqlQuery<Dealer>( "usp_InsertDealer @Name, @Description", new SqlParameter("@DealerID",
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)
));
}
public long add经销商(经销商)
{
返回Convert.ToInt32(AWJE.Database.SqlQuery(
“usp_InsertDealer@Name,@Description”,
新的SqlParameter(“@DealerID”,dealer.DealerID).Value,
新的SqlParameter(“@Name”,dealer.Name),
新的SqlParameter(“@Description”,dealer.Description)
));
}
是否有一种更优雅或更干净的方式来传递多个参数,而不是显示的方式?如果我遇到其他需要传递更多参数的存储过程,那么这种方式看起来很快就会变得一团糟。您的代码示例显然不是一个有效的示例:
Dealer
类型的对象转换为int
long
,那么为什么要将存储过程的结果转换为int
@DealerID
参数,但它不是SP调用的一部分SqlParameter
s调用了.Value
addpublic long AddDealer(Dealer dealer)
{
return AWJE.Database.SqlQuery<Dealer>(
"usp_InsertDealer @Name, @Description",
new SqlParameter("@Name", dealer.Name),
new SqlParameter("@Description", dealer.Description)
).DealerID;
}
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
);
}
public long add经销商(经销商)
{
返回AWJE.Database.SqlQuery(
“usp_InsertDealer@Name,@Description”,
经销商名称,
经销商,描述
);
}
。。。其中,如何命名@name
或@Description
不再重要,但必须确保以正确的顺序传递参数值
除此之外,我不知道您是否可以使它更干净或更优雅。您是先使用代码还是生成了edmx?我知道在过去,我在edmx中添加了一个存储过程,然后能够像调用函数一样调用它@kmacdonald,我在SSMS中编写了存储过程和表,然后从数据库中生成。我不知道
usp\u InsertAddress
到底做了什么,但在我看来,您可以只使用一个实体,然后将其添加到上下文和SaveChanges()
中,或者,如果需要使用存储过程进行CUD操作,相应地映射存储的进程。EF还将尝试将存储过程的结果具体化为IEnumerable
,因此我不太确定Convert.ToInt32()
在这里应该如何工作。@Pawel,我注意到我写的东西有一个缺陷。我还不能测试任何东西,因为我还有很多方法要写。usp_InsertAddress是一个crud操作并返回新的ID,这就是为什么我让它将返回值转换为Int32,这是错误的,这将是我的下一个问题,因为我改变了方法。我要做的是用更新的版本来编辑这个方法,更新后的版本是关于如何获取返回的ID的。谢谢你澄清了问题,你是对的,这不是一个有效的例子,因为我没有机会测试,因为我还有很多东西要写,并且要测试后者,所以我很感激这个修复。那么前两个代码块中的任何一个都会给我存储过程返回的ID?仅仅是能够删除命名参数和使用位置参数,就可以更彻底地清理它。