Почему изменился порядок импорта параметров из хранимой процедуры? - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть хранимая процедура в SQL Sever 2008, как:

ALTER PROCEDURE [dbo].[mySP]
@FirstName As varchar(30),  
@LastName As varchar(30),   
@ID As int 
As 
Begin
--......
End

затем в EF импортировали этот SP как функцию типа:

public ObjectResult<Nullable<global::System.Int32>> MyFunc(global::System.String LastName,  global::System.String FirstName,Nullable<global::System.Int32> ID)
{
//....
}

долго работает нормально.

Затем я добавляю кое-что новое в EF edmx с «обновлением из базы данных» сегодня, параметр функции изменился! стало:

public ObjectResult<Nullable<global::System.Int32>> MyFunc(global::System.String LastName,Nullable<global::System.Int32> ID,  global::System.String FirstName)
{
//....
}

В это трудно поверить. У меня уже есть много кодов для вызова этой функции, и она работала нормально. Теперь все они не работают. Даже я могу вручную изменить параметр, но, возможно, он вернет оригинальный порядок с сгенерированным кодом!

Как решить эту проблему.

Ответы [ 4 ]

4 голосов
/ 08 марта 2012

Эта ошибка возникает при использовании ALTER PROCEDURE в хранимой процедуре и появляется не во всех случаях.

Мы смогли показать, что порядок параметров контролируется SQL и что после изменения сохраненнойсписок параметров proc (например, добавление параметра, особенно параметра со значением по умолчанию), а затем с помощью «Обновить модель из базы данных» в модели Entity порядок параметров становится алфавитным.Одна возможность состоит в том, что в SQL есть механизм для обеспечения совместимости с скомпилированными процессами, когда добавляется необязательный параметр, и это проявляется в наблюдаемом поведении.,Единственный способ восстановить правильный порядок параметров - это DROP и CREATE хранимой процедуры, а затем обновить модель.Никакие изменения в модели хранения не сохранятся после обновления из базы данных.

Мы используем SQL 2000.

0 голосов
/ 01 сентября 2016

Убедитесь, что уровень совместимости базы данных не ниже 90

sp_dbcmptlevel 'your_database_name'

Если он сообщает значение ниже 90, запустите

sp_dbcmptlevel 'your_database_name', 90

Благодаря lajones в Codeplex

0 голосов
/ 23 июня 2012

Мы наблюдаем, как эта проблема возникает во многих хранимых процедурах, и мы не смогли определить, почему. Любая новая информация по этому вопросу поможет вам.

Я видел, как это происходит в хранимой процедуре с большим количеством входных и выходных параметров более последовательно. Более того, при обновлении базы данных команда, которая при сохранении процедуры не изменяется, а также файл edmx не изменяется, но конструктор вызывает изменение порядка параметров.

0 голосов
/ 11 ноября 2010

Начиная с EF4, генерация кода по умолчанию также основана на шаблоне T4.Развернув этот T4, мы увидим, как он генерирует коды для импорта функции:

<code>foreach (EdmFunction edmFunction in container.FunctionImports)
{
    IEnumerable<FunctionImportParameter> parameters = 
FunctionImportParameter.Create(edmFunction.Parameters, code, ef);
    string paramList = string.Join(", ", parameters.Select(p => 
        p.FunctionParameterType + " " + p.FunctionParameterName).ToArray());
...
Так что он точно основан на том, как ваша SSDL-схема выглядит под вашей моделью.Например, для uspUpdateEmployeePersonalInfo SP в Adventureworks база данных:
CREATE PROCEDURE [HumanResources].[uspUpdateEmployeeHireInfo]
    @EmployeeID [int], 
    @Title [nvarchar](50), 
    @HireDate [datetime], 
    @RateChangeDate [datetime], 
    @Rate [money], 
    @PayFrequency [tinyint], 
    @CurrentFlag [dbo].[Flag] 

SSDL выглядит следующим образом:

<code><Function Name="uspUpdateEmployeePersonalInfo" Aggregate="false" 
BuiltIn="false" NiladicFunction="false" IsComposable="false"
 ParameterTypeSemantics="AllowImplicitConversion" Schema="HumanResources">
          <Parameter Name="EmployeeID" Type="int" Mode="In" />
          <Parameter Name="NationalIDNumber" Type="nvarchar" Mode="In" />
          <Parameter Name="BirthDate" Type="datetime" Mode="In" />
          <Parameter Name="MaritalStatus" Type="nchar" Mode="In" />
          <Parameter Name="Gender" Type="nchar" Mode="In" />
</Function>
И это приведет кэтот код, который будет сгенерирован внутри ObjectContext:
public int UpdateEmployeePersonalInfo(Nullable<global::System.Int32> employeeID, 
                                     global::System.String nationalIDNumber, 
                                     Nullable<global::System.DateTime> birthDate,
                                     global::System.String maritalStatus, 
                                     global::System.String gender)

Я предполагаю, что порядок свойств в вашей схеме SSDL в вашей модели был изменен, и EF генерирует новые коды, соответствующие этому.Поэтому после проверки того, что параметры объявлены в нужном порядке в вашем SP внутри базы данных, попробуйте удалить SP из вашей модели и обновить вашу модель из базы данных еще раз, и вы увидите, что сгенерированный код метода будет изменен соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...