Как сообщить Entity Framework Function Import, что столбец, возвращаемый хранимой процедурой, не может быть недействителен?

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

CREATE PROCEDURE [jp].[GetFoo]
    @Guid UNIQUEIDENTIFIER
AS

SELECT
    CONVERT(BIT, (CASE WHEN [dbo].[GetBar](T.Col2) = 3 THEN 1 ELSE 0 END)) IsGetBarCol2EqualToThree
FROM 
    [dbo].[MyTable] T
WHERE
    T.Col1 = @Guid

Когда я делаю функцию Импорт/получение информации о столбцах в EF, выводимый тип столбца IsGetBarCol2EqualToThree Nullable<bool>. Но нет никакого способа, чтобы это поле было нулевым, поэтому я хотел бы просто bool. Есть ли способ сделать это, который будет постоянным при обновлении (т.е. Который не зависит от модификации любого сгенерированного кода)?

Версия SQL Server - 2005, я использую Visual Studio 2010SP1 с EF 4, проект скомпилирован с .net 4.0.

Ответы

Ответ 1

Сделайте эту модификацию: isnull([dbo].[GetBar](T.Col2), 0)

Ответ 2

Вы можете создать сложный тип, а затем изменить свойство Nullable сгенерированного поля. Может быть полезно, если вы не хотите менять свой sp.

шаг за шагом:

  • откройте свой edmx
  • браузер открытой модели (View- > Other Windows- > Entity Data Model Browser)
  • перейдите к полю в сгенерированном сложном типе (*.emdx- > Model- > Complex Types- > your type- > field)
  • открыть окно свойств (нажмите F4)
  • среди свойств должен быть Nullable. Вы можете изменить его здесь, и он не будет перезаписан в следующем обновлении модели, но если вы воссоздаете сложный тип, вы потеряете свою настройку.

В качестве альтернативы вы можете открыть edmx как xml и найти то же свойство.

<ComplexType Name="...">
          <Property Type="Int32" Name="..." Nullable="true" />

ps: Я тестировал его в VS2012, EF 5

Ответ 3

Вам нужно решить эту проблему.

1- alter procedure to isnull ( "ваше выражение", 0), затем обновите свою модель из базы данных и обновите ее.

2- вы можете открыть модель класса и изменить ее вручную, но любое обновление модели снова потеряет изменение.

Итак, мое мнение - первое решение, лучшее из лучших.