【问题标题】:How do I tell Entity Framework Function Import that a column returned by a stored procedure is not nullable?如何告诉实体框架函数导入存储过程返回的列不可为空?
【发布时间】:2012-02-14 07:13: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)?
  • 它有效,谢谢。您可以将其作为答案,我会接受!

标签: c# sql-server entity-framework .net-4.0


【解决方案1】:

你必须想办法解决这个问题

1- 将过程更改为 isnull ("your expression", 0) 然后从数据库更新您的模型并刷新。

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

所以我的意见是第一个解决方案是最好的。

【讨论】:

    【解决方案2】:

    您可以创建复杂类型,然后修改生成字段的 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中测试过

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 作为附加信息,我发现函数导入中有一个错误:ISNULL 事情有效,但您必须从 SP 中删除列,导入它,重新添加列(使用 ISNULL 更改),然后将其导入回来。
      • @EvrenKuzucuoglu - 是的,某些更改不会通过使用 GUI 中的更新命令得到更新。你会发现在 EF 中使用存储过程是一件很头疼的事:(
      • @EvrenKuzucuoglu - 不仅仅是存储过程 - 对表/视图的更改(列重命名、可空性更改)也不会在 UI 中正确刷新。
      • 对于一些复杂的视图,这种解决方法并不总是成功的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2015-05-14
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多