为什么HasLoadedOrAssignedValue属性设置为true?

时间:2009-07-14 07:43:50

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

嘿伙计们,好的,这是情景:

VS 2008 .NET 3.5 SP1,LINQ to SQL。

我有一个Product Entity,它有一个ImageID字段,因此它与Image Entity有关系。这都是在架构和DBML中定义的。

现在,假设我创建了一个没有ImageID的新Product实体,并将其保存到数据库中。此时,Entity的_Image字段将HasLoadedOrAssignedValue设置为false,就像它应该的那样。

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

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

现在,我知道有人说,“哦,你必须设置关系属性本身,所以,Product.Image = someImage,而不是Product.ImageID = 2”,但我总是设置ID字段,它总是工作....好吧,几乎总是

所以,我的问题有两个:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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