如何告诉实体框架函数导入存储过程返回的列不可为null

本文关键字:null 返回 存储过程 实体 何告诉 框架 函数 导入 | 更新日期: 2023-09-27 18:20:59

我有一个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,我使用的是带有EF 4的Visual Studio 2010SP1,该项目是根据.net 4.0编译的。

如何告诉实体框架函数导入存储过程返回的列不可为null

进行此修改:isnull([dbo].[GetBar](T.Col2), 0)

您可以创建复杂类型,然后修改生成字段的Nullable属性。如果你不想改变你的sp.,这可能很有用

逐步:

  • 打开你的edmx
  • 打开模型浏览器("视图"->"其他窗口"->"实体数据模型浏览器")
  • 导航到生成的复杂类型中的字段(*.emdx->Model->complex Types->your-type->field)
  • 打开属性窗口(按F4)
  • 在属性中应该有Nullable。你可以在这里更改它,它不会在下一次模型更新时被覆盖,但如果你重新创建复杂的类型,你会失去调整

或者,您可以将edmx作为xml打开,并找到相同的属性。

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

ps:我在VS2012、EF 5 中测试了它

您必须找到解决问题的方法

1-将过程更改为isull("您的表达式",0),然后从数据库更新模型并刷新。

2-你可以打开类模型并手动更改它,但对模型的任何更新都将丢失更改。

所以我认为第一个解决方案是最好的。