在Entity Framework 6.1中,在基于C#代码的迁移中(使用System.Data.Entity.Migrations.DbMigration),在使用DbMigration.AlterStoredProcedure方法更改存储过程定义时,添加或添加的正确语法是什么修改smallmoney
类型的存储过程参数(在SQL Server 2012上)?
例如,如果我有一个迁移方法修改现有的SQL Server存储过程,该过程分别采用类型为int
,varchar
和smallmoney
的三个参数:
public partial class MyCustomMigration : DbMigration
{
public override void Up()
{
this.AlterStoredProcedure("dbo.EditItem", c => new
{
ItemID = c.Int(),
ItemName = c.String(),
ItemCost = /* What goes here to represent the smallmoney SQL Server type? */
},
@" (New sproc body SQL goes here) ");
}
// ...
}
答案 0 :(得分:2)
谢谢,nemesv,您的评论提示!我缺少的是在设置存储过程参数时指定的类型,即" Int"和"字符串"在:
c => new
{
ItemID = c.Int(),
ItemName = c.String(),
//...
}
...实际上是方法,并且每个方法 - 在类System.Data.Entity.Migrations.Builders.ParameterBuilder上 - 都有一组可选参数,这些参数会影响从迁移脚本生成的SQL。
对于smallmoney
类型存储过程参数,我最终使用:
ItemCost = c.Decimal(precision: 10, scale: 4, storeType: "smallmoney")
精度值:10和比例:4来自MSDN文章money and smallmoney (Transact-SQL),它指定smallmoney
具有10的精度(总数字数)和比例(数字的#位数)小数点右侧)4(适用于SQL Server 2008及更高版本)。
所以我的完整迁移代码是:
public override void Up()
{
this.AlterStoredProcedure("dbo.EditItem", c => new
{
ItemID = c.Int(),
ItemName = c.String(),
ItemCost = c.Decimal(precision: 10, scale: 4, storeType: "smallmoney")
},
@" (New sproc body SQL goes here) ");
}
哪个产生了SQL:
ALTER PROCEDURE [dbo].[EditItem]
@ItemID [int],
@ItemName [nvarchar](max),
@ItemCost [smallmoney]
AS
BEGIN
(New sproc body SQL goes here)
END