在实体框架中,当列被定义为不可为空时,如何使存储过程返回为空?

时间:2013-05-29 11:01:10

标签: c# sql-server entity-framework

在SQL server中,我有一个表,其列定义为不可为空。

我有一个存储过程做一些连接,以便该字段的结果输出列实际上永远不为null。

在EF5中,我有一个由EF自动生成的输出的复杂类型(当我将存储过程添加到模型时),并且该字段生成为“nullable = false”我猜是因为该列的定义所有连接的表都是“NOT NULL”。

现在,在我的解决方案中,我使用存储过程查询数据库并执行联合(仅用于显示,没有“保存更改”),其中我联合的表在某些行中对于该列/字段具有NULL;而且我遇到了麻烦,因为我得到一个例外,我的复杂类型不允许使用null。

到目前为止,我的解决方案是手动将不可空变为可变的复杂类型字段的类型,但每次我从模型更新时,我的变更都会被恢复(当然)。

我想有一个更聪明的解决方案,但我看不到它......

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果你有一个proc,它返回一个名为mycol的非可空列,如下所示

     create PROCEDURE [dbo].[test1] 
         AS
         BEGIN
        SET NOCOUNT ON;
      select col1,col2,col3,mycol from mytable
         END    

你可以简单地将你的select语句与一个空结果集联合起来,该结果集包含一个需要为空的列的null

create PROCEDURE [dbo].[test2] 
AS
BEGIN
SET NOCOUNT ON;
select col1,col2,col3,mycol from mytable
union
select col1,col2,col3,null from mytable where 1=2

END

EF使用mycol输入test1为nullable = false,并使用mycol导入test2为nullable = true

答案 1 :(得分:0)

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

一步一步:

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

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

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

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

同样的事情https://stackoverflow.com/a/19156169/292787