ado net Entity framework 自关联的数据无法保存

qq_ll_yy 2010-06-03 10:46:32
我有一个实体类 房屋, 房屋这个实体自关联,分别为父房屋和子房屋. 现在有两个实体parentHouse和childHouse,已经都存在数据库里了,我想把二者关联起来.但保存.报错的代码是"The EntityReference could not be loaded because it is not attached to an ObjectContext". 下面是代码

public Boolean 保存房屋间关系(房屋 parentHouse, 房屋 childHouse, String 关系类型)
{
int i = 0;
using (CHILIEntities context = new CHILIEntities())
{
context.Connection.Open();
DbTransaction trans = context.Connection.BeginTransaction();
try
{
//保存房屋
EntityKey key;
object originalHouse;

key = context.CreateEntityKey("房屋", childHouse);
if (context.TryGetObjectByKey(key, out originalHouse))
{
context.Attach(parentHouse);
childHouse.父房屋编号 = parentHouse.房屋编号;
//if (!childHouse.房屋1.IsLoaded)
//{
// childHouse.房屋1.Load();
//}
//childHouse.房屋1.Add(parentHouse);

//childHouse.房屋2.EntityKey = context.CreateEntityKey("房屋", parentHouse);
if (!childHouse.房屋2Reference.IsLoaded)
{
childHouse.房屋2Reference.Load();
}

childHouse.房屋2 = parentHouse;
context.ApplyCurrentValues<房屋>(key.EntitySetName, childHouse);
i = context.SaveChanges();
trans.Commit();
}
else
{
throw new PLATOException("没有对应的房屋");
}
return true;

}
catch (Exception e)
{
Console.WriteLine("exception:" + e.StackTrace);
throw e;
}
finally
{
context.Connection.Close();
}
}
}
...全文
280 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ck436 2011-04-11
  • 打赏
  • 举报
回复
1. 从数据库中 TryGetObjectByKey() 得出原始父House, 标记 parentHouse 为已更改;
2. 再从原始父House中得到 原始Houses ,和 parentHouse.Houses 进行比较,以确定 childHouse 是新增加的还是被更改的;
3. context.SaveChanges()
-------------------------------------------------------
如何要保存很多数据,还进行比较以确定是新增的还是更改的,那多麻烦啊
Valefish 2010-07-27
  • 打赏
  • 举报
回复
学习中
badi888 2010-07-27
  • 打赏
  • 举报
回复
楼主可以试试用事务搞定。。。
justwantfly 2010-07-13
  • 打赏
  • 举报
回复
同样遇到这个问题……
顶下……
Sunpire 2010-06-03
  • 打赏
  • 举报
回复
既然已搞为自关联,就是说 childHouse 是 parentHouse.Houses(假设导航属性是这个名字) 中的一项,那在参数中就不该出现 childHouse ,直接用
public Boolean 保存房屋间关系(房屋 parentHouse, String 关系类型){
}

代码中也不该出现
if (!childHouse.房屋2Reference.IsLoaded)
{
childHouse.房屋2Reference.Load();
}

childHouse.房屋2 = parentHouse;
context.ApplyCurrentValues<房屋>(key.EntitySetName, childHouse);

也是按照正常的 parentHouse 来更新流程来写:

1. 从数据库中 TryGetObjectByKey() 得出原始父House, 标记 parentHouse 为已更改;
2. 再从原始父House中得到 原始Houses ,和 parentHouse.Houses 进行比较,以确定 childHouse 是新增加的还是被更改的;
3. context.SaveChanges()

另外,建议LZ使用隐式事务(事务范围),比显式事务易用,而且没看到LZ有显式Rollback()的语句。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧