System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException: Operation is not valid due to the current state of the obj
Posted on 2010-07-28 17:44 ZhangPeng.Chen 阅读(1063) 评论(1) 编辑 收藏 举报
用Linq to sql挺长一段时间了,今天第一次碰到这个错误。
场景重现及简化:
场景重现及简化:
var user = userRepository.GetUser(userId);
if(roleId > 0) {
user.RoleId = roleId;
} else {
user.RoleId = null;
}
userRepository.Save();
if(roleId > 0) {
user.RoleId = roleId;
} else {
user.RoleId = null;
}
userRepository.Save();
这段代码普通的不能再普通,先取用户,设置角色,更新。
不过出错了。
在user.RoleId = roleId或者user.RoleId = null的位置会抛出异常
System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException: Operation is not valid due to the current state of the obj
[Column(Storage="_RoleId", DbType="Int")]
public System.Nullable<int> RoleId
{
get
{
return this._RoleId;
}
set
{
if ((this._RoleId != value))
{
if (this._Role.HasLoadedOrAssignedValue)
{
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}
this.OnRoleIdChanging(value);
this.SendPropertyChanging();
this._RoleId = value;
this.SendPropertyChanged("RoleId");
this.OnRoleIdChanged();
}
}
}
public System.Nullable<int> RoleId
{
get
{
return this._RoleId;
}
set
{
if ((this._RoleId != value))
{
if (this._Role.HasLoadedOrAssignedValue)
{
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}
this.OnRoleIdChanging(value);
this.SendPropertyChanging();
this._RoleId = value;
this.SendPropertyChanged("RoleId");
this.OnRoleIdChanged();
}
}
}
我们来分析下这个错误
1. 异常抛出的位置:
if (this._Role.HasLoadedOrAssignedValue) {
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}
_Role这个关联对象已经被加载出来的时候,重新设置主键RoleId不被允许。
我有加载过Role吗?想想?
在创建DataContext的位置 -_-!
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<User>(it => it.Role);
DataContext.LoadOptions = loadOptions;
loadOptions.LoadWith<User>(it => it.Role);
DataContext.LoadOptions = loadOptions;
因为希望加载用户的时候立即加载角色,所以就有了上面的代码,我并不想去掉这个,怎么办呢?只能重新取了。
var user = userRepository.GetUser(userId);
if(roleId > 0) {
//user.RoleId = roleId;
user.Role = roleRepository.GetRole(roleId);
} else {
//user.RoleId = null;
user.Role = null;
}
userRepository.Save();
if(roleId > 0) {
//user.RoleId = roleId;
user.Role = roleRepository.GetRole(roleId);
} else {
//user.RoleId = null;
user.Role = null;
}
userRepository.Save();