DbMigration.AlterstoredProcedure(实体框架迁移):如何表示类型smallmoney?

时间:2014-12-29 22:05:24

标签: c# sql-server entity-framework entity-framework-6.1

在Entity Framework 6.1中,在基于C#代码的迁移中(使用System.Data.Entity.Migrations.DbMigration),在使用DbMigration.AlterStoredProcedure方法更改存储过程定义时,添加或添加的正确语法是什么修改smallmoney类型的存储过程参数(在SQL Server 2012上)?

例如,如果我有一个迁移方法修改现有的SQL Server存储过程,该过程分别采用类型为intvarcharsmallmoney的三个参数:

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) ");
    }

    // ...
}

1 个答案:

答案 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