实体框架错误:具有空EntityKey值的对象不能附加到对象上下文
本文关键字:对象 不能 上下文 EntityKey 错误 框架 实体 | 更新日期: 2023-09-27 18:17:40
在我的应用程序中,我有以下代码…
public Boolean SaveUserInformation(UserInfoDTO UserInformation)
{
return dataManager.SaveUserInfo(new UserInfo()
{
UserInfoID = UserInformation.UserInfoID.HasValue ? UserInformation.UserInfoID.Value : 0,
UserID = UserInformation.UserID,
ProxyUsername = UserInformation.ProxyUsername,
Email = UserInformation.Email,
Status = UserInformation.Status
});
}
这段代码调用了dataManager对象上的一个方法,该方法利用了实体框架…
public Boolean SaveUserInfo(UserInfo userInfo)
{
try
{
//Validate data prior to database update
if (userInfo.UserID == null) { throw new Exception("UserInfoDomainModel object passed to PriorityOne.Data.DataManager.SaveUserInfo with UserID property set to NULL."); }
if (userInfo.ProxyUsername == null) { throw new Exception("UserInfoDomainModel object passed to PriorityOne.Data.DataManager.SaveUserInfo with ProxyUsername property set to NULL."); }
if (userInfo.Email == null) { throw new Exception("UserInfoDomainModel object passed to PriorityOne.Data.DataManager.SaveUserInfo with Email property set to NULL."); }
if (userInfo.UserInfoID == 0)
{
//Perform Insert
using (PriorityOneEntities entities = new PriorityOneEntities())
{
entities.UserInfoes.AddObject(userInfo);
entities.SaveChanges();
}
}
else
{
//Perform Update
using (PriorityOneEntities entities = new PriorityOneEntities())
{
entities.Attach(userInfo);
entities.SaveChanges();
}
}
return true;
}
catch (Exception ex)
{
//TODO: Log Error
return false;
}
}
这段代码上的插入工作得很好。但是当我尝试执行更新时,我得到一个错误说:"具有null EntityKey值的对象不能附加到对象上下文。"
它出现在这行代码中:entities.Attach(userInfo);
我试图完成的是避免为了选择我稍后要更改和更新的记录而往返数据库,从而两次往返数据库。
你知道哪里出了问题,或者我怎样才能更好地完成这个吗?
谢谢。
你必须告诉EF你想要你的实体被更新(修改状态):
//Perform Update
using (PriorityOneEntities entities = new PriorityOneEntities())
{
entities.Entry(userInfo).State = EntityState.Modified;
entities.SaveChanges();
}
注:你不需要显式地调用Attach
。这是在幕后完成的。
:
根据你的评论,你使用的是EF 4.0。这是你必须做的,以附加您的对象修改在EF 4.0:
ctx.AddObject("userInfoes", userInfo);
ctx.ObjectStateManager.ChangeObjectState(userInfo, EntityState.Modified);
ctx.SaveChanges();
不能使用Attach
方法。从http://msdn.microsoft.com/en-us/library/bb896271.aspx:
如果一个特定类型的多个实体具有相同的键值,实体框架将抛出异常。为了避免出现异常,可以使用AddObject方法来附加分离的对象,然后适当地更改状态。
From MSDN
传递给Attach方法的对象必须有一个有效的EntityKey价值。如果对象没有有效的EntityKey值,使用AttachTo方法指定实体集的名称。