C# 如何告诉实体框架函数导入存储过程返回的列不可为null?
我有一个SQL Server存储过程,其中包含以下内容:C# 如何告诉实体框架函数导入存储过程返回的列不可为null?,c#,sql-server,entity-framework,.net-4.0,C#,Sql Server,Entity Framework,.net 4.0,我有一个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
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中执行函数Import/Get列信息时,该列的推断类型是getBarCol2eQualtotree,即Nullable
。但是这个字段不可能是空的,所以我希望它只是bool
。有没有一种方法可以在更新时保持不变(即不依赖于修改任何生成的代码)
SQL Server版本是2005年,我使用的是Visual Studio 2010SP1和EF 4,项目是根据.net 4.0编译的。进行以下修改:
isnull([dbo].[GetBar](T.Col2),0)
您可以创建复杂类型,然后修改生成字段的可空属性。
如果您不想更改sp,则此功能非常有用
逐步:
- 打开你的edmx
- 打开模型浏览器(视图->其他窗口->实体数据模型浏览器)
- 导航到生成的复杂类型(*.emdx->Model->complex Types->your type->field)中的字段
- 打开属性窗口(按F4键)
- 属性中应该有可为空的。您可以在此处更改它,它不会在下一次模型更新时被覆盖,但如果重新创建复杂类型,您将失去调整
<ComplexType Name="...">
<Property Type="Int32" Name="..." Nullable="true" />
ps:我在VS2012中测试了它,EF 5您必须找到解决此问题的方法 1-将过程更改为isnull(“您的表达式”,0),然后从数据库更新模型并刷新 2-您可以打开类模型并手动更改它,但是如果再次对模型进行任何更新,您将丢失更改
因此,我认为第一种解决方案是最好的。如果你这样做会发生什么。isnull([dbo].[GetBar](T.Col2),0)?它可以工作,谢谢。你可以这样回答我,我会接受的!作为补充信息,我发现函数导入中有一个错误:ISNULL可以工作,但您必须从SP中删除列,导入它,重新添加列(使用ISNULL更改),然后重新导入。@EvrenKuzucuoglu-是的,某些更改不能通过使用GUI中的update命令进行更新。您会发现,将存储过程与EF一起使用是一个主要的难题:(@EvrenKuzucuoglu-这不仅仅是存储过程-对表/视图的更改(列重命名、可空性更改)在UI中也没有正确刷新。对于某些复杂视图,此解决方法并不总是成功的。