【问题标题】:SQL Server 2008 View with LEFT OUTER JOIN fails on Entity Framework 4SQL Server 2008 View with LEFT OUTER JOIN 在实体框架 4 上失败
【发布时间】:2012-08-31 15:55:22
【问题描述】:
  • SQL Server 2008R2
  • Entity Framework 4.x(早期版本)

我最近更改了 SQL Server 2088 R2 实例中的视图,使其现在包含一些 LEFT OUTER JOINS 而不是 INNER JOINS,这导致某些字段现在包含 NULL。这留下了一个例外,即不允许此字段为空,因为它们是实体键。

请注意,所有显示的都必须是实体键,并且图像仅显示整个视图的一部分。

那么我做错了什么吗?有什么解决方法吗?还是我必须忍受它。

这是错误之一

错误 213 运行转换:关键部分:类型的“WorkStepId” OrderSummary 无效。键的所有部分都不能为空。

【问题讨论】:

    标签: sql-server sql-server-2008 entity-framework entity-framework-4


    【解决方案1】:

    实体键不允许为 NULL。实体框架必须能够通过一个或多个键的组合来确定实体的唯一性。我不知道您的确切数据情况,但可能有办法解决此要求,但不是很干净。

    一种可能的解决方法是在您的视图 T-SQL 中包含逻辑,以将 NULL 值合并到一个已知的“虚拟”值。例如,使用上面的数据,您可以在读取时将两个 NULL 值设置为 -1。然而:

    • 您必须在保存时使用某种验证逻辑或存储过程,以防止在进行写入时将不良数据持久化到数据库中。
    • 您必须确保只能返回一行,其中 WorkStepId 和 StepStatusId per Id 有两个 NULL 值。

    【讨论】:

    • 这是我目前使用的解决方法。检查 NULL 并为其插入默认值。我认为有一种方法可以使键为空。但听起来没有......
    • 键不能为 NULL,因为它们用于标识唯一记录。因为 NULL 永远不会被认为与其他 NULL 相等,所以在用于标识记录或比较键时会出现问题。
    • EF 有可能将错误的值推断为实体键。只需检查实体并确保将正确的字段设置为实体键。
    【解决方案2】:

    EF 生成视图以将所有字段作为键,并且键必须具有值。使用左连接,您将拥有空列。因此,您将需要修改您现在可以为空的类型字段,以便它们不是键。目前我还没有机会在本地进行测试,所以我不能说您是否只需要修改概念级别或需要进入 DBML 手动调整 SSDL 中的键。

    【讨论】:

    • 我之前试过这个,但碰巧他们需要是钥匙。我认为有一种方法可以使键为空。但听起来没有......
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多