如何告知实体框架功能导入存储过程返回的列不可为空?

时间:2012-01-19 16:05:04

标签: 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

当我在EF中执行函数导入/获取列信息时,列IsGetBarCol2EqualToThree的推断类型为Nullable<bool>。但是这个字段无法为空,所以我希望它只是bool。有没有办法在更新时保持持久性(即不依赖于修改任何生成的代码)?

SQL Server版本是2005,我使用Visual Studio 2010SP1和EF 4,项目是针对.net 4.0编译的。

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

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

一步一步:

  • 打开您的edmx
  • 打开模型浏览器(查看 - &gt;其他Windows-&gt;实体数据模型浏览器)
  • 导航到生成的复杂类型中的字段(* .emdx-&gt;模型 - &gt;复杂类型 - &gt;您的类型 - &gt;字段)
  • 打开属性窗口(按F4)
  • 属性中的
  • 应该是Nullable。您可以在此处进行更改,并且不会在下一次模型更新时覆盖它,但如果重新创建复杂类型,则会忽略您的调整。

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

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

ps:我在VS2012,EF 5中进行了测试

答案 2 :(得分:0)

您必须解决此问题的方法

1- alter procedure is isnull(&#34;你的表达式&#34;,0)然后从数据库更新你的模型并刷新。

2-您可以打开班级模型并手动更改,但是再次对模型进行任何更新,您将失去更改。

所以我的观点是第一个解决方案是最好的。