2014-12-29 2 views
2

В Entity Framework 6.1 в миграции на основе кода на C# (с использованием System.Data.Entity.Migrations.DbMigration) при изменении определения хранимой процедуры с использованием метода DbMigration.AlterStoredProcedure в качестве правильного синтаксиса для добавления или изменения параметра хранимой процедуры типа smallmoney (на SQL Server 2012)?DbMigration.AlterstoredProcedure (Entity Framework migration): как представить тип smallmoney?

Например, если у меня есть метод миграции, который изменяет существующую хранимую процедуру 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) "); 
    } 

    // ... 
} 
+1

Вы можете попробовать с 'ItemCost = c.Decimal (storeType: "smallmoney")' ... На самом деле вы можете использовать любой метод здесь: 'c.Int()' или 'c.Double()' или что-либо, пока вы явно не укажете 'storeType:" smallmoney "' – nemesv

+0

. Связанный с этим вопрос: как указать длину для строковых переменных: http://stackoverflow.com/ вопросы/7341783/объектный-рамочный-данные-аннотаций-набор-StringLength-VARCHAR/7341920 –

ответ

2

Спасибо, nemesv, для подсказки в вашем комментарии! То, что мне не хватает в том, что типы уточняются при настройке параметров хранимых процедур, то есть «Int» и «String» в:

c => new 
    { 
     ItemID = c.Int(), 
     ItemName = c.String(), 
     //... 
    } 

... на самом деле являются методами, и каждый из этих методов - на class 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