Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不尝试更改外键时,ForeignKeyReferenceAlreadyHasValueException是否发生异常?_C#_Linq To Sql - Fatal编程技术网

C# 不尝试更改外键时,ForeignKeyReferenceAlreadyHasValueException是否发生异常?

C# 不尝试更改外键时,ForeignKeyReferenceAlreadyHasValueException是否发生异常?,c#,linq-to-sql,C#,Linq To Sql,在下面的代码中,我不相信我正在更改外键,但我可能错了。当我运行它时,我得到一个异常: ForeignKeyReferenceAlreadyHasValueException 代码如下: UsersModule um = dc.UsersModules.Where(x => x.UserId == IdParam).FirstOrDefault(); int oldModuleId = um.ModuleId; string oldModule = um.Module.ModuleName;

在下面的代码中,我不相信我正在更改外键,但我可能错了。当我运行它时,我得到一个异常:

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

我不知道为什么会出现此错误,因为我只是尝试将ModuleName的值存储到字符串oldModule中,而不是更改um.ModuleName.ModuleName

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

我认为上面的代码应该可以工作。这是LINQtoSQL中很酷的特性之一。他并没有试图改变任何事情,只是阅读价值观。我只是修正了我的答案。设置或读取不重要。确定,这解释了获取时的错误,但ModuleName不是外键。你能解释一下外来实体是什么吗?仍然不确定为什么读数会失败。我只是试着测试了一下,它成功了。我知道如果你这样读:um.Module,你就不能再改变um.ModuleId的值了。但是在这里,它是唯一的读物。试着查看manifest文件.dbml后面的泛型代码文件。假设您使用设计器添加L2S类。试着看看在getter中是否有异常抛出。我看了一下,它被抛出geter。我迷路了。我试图在没有运气的情况下复制这个。我把两张桌子放在架子上,一张桌子上有外键。说B->A。然后我从B获得一个项目,并尝试通过B ojebct访问A对象,并以名称非键的形式读取。像这样B=dc.Bs.First;字符串s=b.A.Name;而且成功了。。