如何告诉实体框架函数导入存储过程返回的列不可为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编译的。
进行此修改: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-你可以打开类模型并手动更改它,但对模型的任何更新都将丢失更改。
所以我认为第一个解决方案是最好的。