【问题标题】:Why is HasLoadedOrAssignedValue Property set to true?为什么 HasLoadedOrAssignedValue 属性设置为 true?
【发布时间】:2010-11-10 13:48:45
【问题描述】:

这是场景:

  • VS 2008 .NET
  • 3.5 SP1
  • LINQ to SQL

我有一个产品实体,它有一个 ImageID 字段,因此它与图像实体有关系。这都是在模式和 DBML 中定义的。

现在,假设我创建了一个没有 ImageID 的新产品实体,并将其保存到数据库中。此时,Entity 的 _Image 字段已将 HasLoadedOrAssignedValue 设置为 false,这是应该的。

现在,当我从数据库中检索该实体时,没有 ImageID,即 ImageID 设置为 null,并且附加到它的 Image Entity 也设置为 null,HasLoadedOrAssignedValue 设置为 true。为什么?

现在,当我尝试将 ImageID 属性设置为有效的 int 时,我得到了 ForeignKeyReferenceAlreadyHasValueException 异常。

现在,我知道有人说,“哦,你必须自己设置关系属性,所以 Product.Image = someImage,而不是 Product.ImageID = 2”,但我总是设置 ID 字段,而且总是有效...嗯,几乎总是这样。

所以,我的问题是双重的:

  1. 为什么 HasLoadedOrAssignedValue 不应该设置为 true?
  2. 更重要的是,为什么我会遇到这种不连贯的行为。我知道你不必总是直接设置实体属性,那为什么这次不行呢?如果这是一条 LINQ to SQL 规则,那为什么有时会破坏这条规则?

【问题讨论】:

  • 问题:您是明确将 ID 设置为 null,还是没有设置? ImageID 是 Image 的 PK 且不可为空吗?如果设置图像对象,它会起作用吗?我知道这不是您想要做的,但确定这是否有效将缩小您的潜在原因列表。如果不了解更多细节,1 和 2 很难回答。

标签: .net linq-to-sql .net-3.5


【解决方案1】:

问题在于查看 Image 属性并导致其加载 - 甚至可能是调试器。

在 Product.Image 属性中设置断点并查看导致它的路径。

【讨论】:

  • 这正是问题所在。在一个测试场景中,我在没有调试的情况下运行了一次,在第二种情况下,我通过观察各种属性来运行它。这导致了错误。显然,如果您在代码中随时检查所述属性的值,则无需调试即可发生错误。
  • 这是一种奇怪的行为,因为实际上,我只是在检查值......如果它实际上是“null”或“Nothing”,那么什么都不应该加载......不是吗?跨度>
  • 如果您查看代码,您会发现属性访问器是延迟加载实现。当您访问该属性时,它会使用外键访问数据库,以便它可以创建对象并将其分配给该属性。完成此操作后,它不希望您更改外键,因为这样会出现不一致,因为 FK 和实体属性不再匹配。
  • 嗯...错误?或者只是一个设计糟糕的实现?因为真的,这个设计没有直观的逻辑......?
【解决方案2】:

所以,我今天遇到了同样的问题,我不知道这是否对任何人有帮助,但事实证明,在我的 LINQ 实体 DBML 文件中,我有一个关系,比如说评论和用户之间的用户 ID。该关系被命名为 User1。当我加载表单时,我使用该关系在状态栏中设置一些信息。不幸的是,我在表单其他地方的下拉列表中也有用户列表。因此,当我尝试更改下拉列表时,它知道数据已在使用中。一旦我对表单状态栏进行了单独的 linq 查询,一切正常。我知道这是预期的行为,但这很令人沮丧。

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 2011-04-02
    • 2011-05-26
    • 2019-10-06
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多