我想为我的实体对象FK列设置一个新值,但我无法找到要设置的属性。我不想从db获得记录。
我有像这样的数据库
Db表:
Concept ConceptType
-Id (PK) -Id(PK)
-Name -Name
-ConceptTypeId(FK) (ALLOW NULL)
代码:
Concept conceptToUpdate = new Concept() { Id = 1 };
ConceptType conceptType = new ConceptType() { Id = 5 };
db.AttachTo("Concept", conceptToUpdate);
db.AttachTo("ConceptType", conceptType);
conceptToUpdate.ConceptType = conceptType;
db.SaveChanges();
如果之前ConceptTypeId(FK)列为NULL,则此代码有效。如果它不是NULL,则给出异常。我跟踪sql查询,问题是在sql查询,因为它检查旧值是否为NULL:S
SQL QUERY :(来自SQL Profiler)
exec sp_executesql N'update [dbo].[Concept]
set [ConceptTypeId] = @0
where (([Id] = @1) and [ConceptTypeId] is null)
',N'@0 int,@1 int',@0=5,@1=1
答案 0 :(得分:1)
它失败的原因是在3.5 SP1中,对于关系,旧的FK值是并发检查的一部分,正如您通过SQL分析器找到的那样。
你需要的是这样的东西:
Concept conceptToUpdate = new Concept() {
Id = 1 ,
ConceptType = new ConceptType {Id = OriginalFKValue}
};
ConceptType conceptType = new ConceptType() { Id = 5 };
db.AttachTo("Concept", conceptToUpdate);
db.AttachTo("ConceptType", conceptType);
conceptToUpdate.ConceptType = conceptType;
db.SaveChanges();
这意味着您不仅需要知道要更新的内容的ID,还需要知道它的原始FK值,这当然是一种真正的痛苦。
因此,EF 4.0中的一项新功能称为FK关联。使用FK关联时,FK的原始值是而不是并发检查的一部分。
希望这有帮助
亚历