2010-07-30 56 views
0

在下面的代码中,我不相信我正在更改外键,但我可能是错的。当我运行它,我得到异常:ForeignKeyReferenceAlreadyHasValueException当不尝试更改外键?

ForeignKeyReferenceAlreadyHasValueException

下面是代码:

UsersModule um = dc.UsersModules.Where(x => x.UserId == IdParam).FirstOrDefault(); 
int oldModuleId = um.ModuleId; 
string oldModule = um.Module.ModuleName; 

将引发错误就行了:

string oldModule = um.Module.ModuleName 

我不知道为什么我得到这个错误,因为我只是试图存储值o f ModuleName转换为字符串oldModule,不改变um.Module.ModuleName

+0

尝试查看清单文件.dbml后面的生成代码文件。假设您使用设计器来添加L2S类。试着看看是否有异常投入获得者。 – 2010-07-30 14:46:11

+0

我看了看,它被扔进了geter。 – Xaisoft 2010-07-30 14:46:48

+0

我输了。我试图重现这个没有运气。我制作了两张桌子,其中一张带有一个外键。说B - > A.然后我从B得到一个项目,并尝试通过B ojebct访问A对象并读取As name(非关键字)。像这样B b = dc.Bs.First();字符串s = b.A.Name;它的工作.. – 2010-07-30 15:01:37

回答

0

LINQ基于关系实体工作。因此,无论何时需要设置/读取外键值,都必须通过设置/读取外键实体来完成。这意味着诸如“Module.ModuleName”之类的快捷方式不能很好地工作。

+0

我认为上面的代码应该工作。这是Linq to Sql的一个很酷的功能。而且他不会试图改变任何事情,只是阅读价值观。 – 2010-07-30 14:35:58

+0

我刚刚修复了我的答案。设置或读取并不重要。 – 2010-07-30 14:37:02

+0

ok,以便在获取时解释错误,但ModuleName不是外键。你能解释一下这个外国实体吗? – Xaisoft 2010-07-30 14:42:25