.net 为什么HasLoadedOrAssignedValue属性设置为true?

.net 为什么HasLoadedOrAssignedValue属性设置为true?,.net,linq-to-sql,.net-3.5,.net,Linq To Sql,.net 3.5,以下是场景: VS 2008.NET 3.5 SP1 LINQ到SQL 我有一个产品实体,它有一个ImageID字段,因此它与图像实体有关系。这都是在模式和DBML中定义的 现在,假设我创建了一个不带ImageID的新产品实体,并将其保存到数据库中。此时,实体的_Image字段已将HasLoadedOrAssignedValue设置为false,这是应该的 现在,当我从DB中检索该实体时,没有ImageID,即ImageID设置为null,附加到它的图像实体也设置为null,HasLoade

以下是场景:

  • VS 2008.NET
  • 3.5 SP1
  • LINQ到SQL
我有一个产品实体,它有一个ImageID字段,因此它与图像实体有关系。这都是在模式和DBML中定义的

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

现在,当我从DB中检索该实体时,没有ImageID,即ImageID设置为null,附加到它的图像实体也设置为null,HasLoadedOrAssignedValue设置为true。为什么?

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

现在,我知道有人说,“哦,你必须设置关系属性本身,因此,Product.Image=someImage,而不是Product.ImageID=2”,但我总是设置ID字段,它总是有效的。。。嗯,几乎总是这样

因此,我的问题有两个:

  • 为什么HasLoadedOrAssignedValue不应该设置为true
  • 更重要的是,为什么我会经历这种不连贯的行为。我知道您不必总是直接设置实体属性,那么为什么这次它不起作用呢?如果这是一个LINQ到SQL的规则,那么为什么有时会打破这个规则呢

  • 问题是查看Image属性并导致其加载—甚至可能是调试器


    在Product.Image属性中设置一个断点,看看是什么路径导致了它。

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

    问题:您是显式地将ID设置为null,还是只是不设置它?ImageID是Image的主键且不可为空吗?如果设置图像对象,是否有效?我知道这不是你想做的,但确定这是否有效将缩小潜在原因的范围。1和2在不了解更多细节的情况下很难回答。这正是问题所在。在一个测试场景中,我在没有调试的情况下运行了一次,在第二个场景中,我通过观察各种属性来运行它。这导致了错误。很明显,如果在代码中的任何时候检查所述属性的值,则在不进行调试的情况下都可能发生错误。这是一种奇怪的行为,因为实际上,我只检查该值……如果它实际上是“null”或“Nothing”,那么什么都不应该加载…不?如果你看一下代码,你会发现属性访问器是一个延迟加载实现。访问属性时,它将使用外键指向数据库,以便创建对象并将其分配给属性。一旦它这样做了,它就不喜欢你更改外键,因为FK和entity属性不再匹配,因此存在不一致性。嗯…bug?或者只是一个设计糟糕的实现?因为真的,这个设计没有直观的逻辑。。。?