EntityFramework. 如何根据判断ObjectStateEntry,来决定是否Attach Entity

hoken2020856 2011-09-05 12:02:09
新人深夜求教:
我的一个删除函数是这么写的:

public bool Delete(Sample et)
{
bool rv = true;
try
{//...
ObjectStateEntry oses = null;
bool isfound =((IObjectContextAdapter)_dataContext).ObjectContext.ObjectStateManager.TryGetObjectStateEntry(et, out oses);
if (oses==null)
_dataContext.Samples.Attach(et);
_dataContext.Samples.Remove(et);
_dataContext.Commit();
}
}
catch(Exception e)
{
rv = false;
}
return rv;
}

一开始没有加ObjectStateEntry 的逻辑,发现有的时候无法删除,报错:An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
显然一个Entity不能Attach两次。于是在MSDN上发现了判断ObjectStateEntry的方法,就加上了。但是现在TryGetObjectStateEntry方法似乎总是失败的。
我曾经干脆就不Attach()了,相同的数据debug下来,居然又报这样的错:The object cannot be deleted because it was not found in the ObjectStateManager.
现在情况就是Attach,然后remove,说不能重复Attach;如果不Attach,直接Remove,又说我忘了Attach...
这可怎么办呢?
...全文
382 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LMAOhuaNL 2011-09-05
  • 打赏
  • 举报
回复
真杯具了,关注
hoken2020856 2011-09-05
  • 打赏
  • 举报
回复
现在不是try的问题。是我的Entity没法强制转换。
[Quote=引用 5 楼 dongxinxi 的回复:]
外面不需要try的

C# code

ObjectStateManager objectStateManager = context.ObjectStateManager;
ObjectStateEntry oses = null;
bool found = _dataContext.ObjectStateManager.TryGetObjectStateEntry(((IEntit……
[/Quote]
  • 打赏
  • 举报
回复
外面不需要try的
ObjectStateManager objectStateManager = context.ObjectStateManager;
ObjectStateEntry oses = null;
bool found = _dataContext.ObjectStateManager.TryGetObjectStateEntry(((IEntityWithKey)et).EntityKey, out oses);
if(!found) //从逻辑上讲应该判断这个标识
_dataContext.Samples.Attach(et);
。。。
hoken2020856 2011-09-05
  • 打赏
  • 举报
回复
谢谢2楼,你说的没错。可是你的方法不好使啊:
Unable to cast object of type 'System.Data.Entity.DynamicProxies.Sample_7AA525D6CFF44D3231CDF1FF262C2C21B315D283DE56DF13BF7B932669AE491C' to type 'System.Data.Objects.DataClasses.IEntityWithKey'.

[Quote=引用 2 楼 abbey 的回复:]
你的参数et是个Sample类的Entity对象吧,对应于表Samples中的行吧。

那么你试试把TryGetObjectStateEntry的第一个参数进行适当的转换,象下面这样,然后看TryGetObjectStateEntry()调用是否成功。
TryGetObjectStateEntry(((IEntityWithKey)et).EntityKey, out oses);


……
[/Quote]
hoken2020856 2011-09-05
  • 打赏
  • 举报
回复
想了一个笨方法回避了这个问题。这可能是由于不同的_dataContext操纵相同的数据导致的。反正很奇怪。而且来自System.Data.Entity的DBSet,在检查ObjectStateEntry时根本不用强制类型转换就能正确获得ObjectState,转换也转换不过去。可是我的那种情况检查ObjectStateEntry时总是失败。也不知为什么。
贪玩的老鼠 2011-09-05
  • 打赏
  • 举报
回复
没用过,帮你顶一下
老毕 2011-09-05
  • 打赏
  • 举报
回复
你的参数et是个Sample类的Entity对象吧,对应于表Samples中的行吧。

那么你试试把TryGetObjectStateEntry的第一个参数进行适当的转换,象下面这样,然后看TryGetObjectStateEntry()调用是否成功。
TryGetObjectStateEntry(((IEntityWithKey)et).EntityKey, out oses);




源码直接下载地址: https://pan.quark.cn/s/387d7c8f6289 在使用IE浏览器的过程中,偶尔会出现重置为默认配置操作未能顺利完成的现象。这种情况的发生可能源于多种因素,包括注册表项出现偏差、浏览器附加组件之间存在不兼容、操作系统授权设置不当或受到恶意程序影响等。针对这一挑战,我们可以通过一系列系统性的方法来逐一诊断和纠正。首先需要验证当前用户是否具备管理员级别的操作权限。在执行重置配置的操作时,必须确保IE浏览器是以管理员身份启动的。具体操作方式为,使用鼠标右键单击IE程序图标,并从弹出的菜单中选择“以管理员身份运行”这一选项。其次,应当检查是否存在恶意软件。恶意程序有时会非法修改浏览器的配置信息,从而阻碍重置过程的正常进行。用户可以借助Windows系统自带的Microsoft Safety Scanner进行检测,或者选择安装并使用第三方安全防护软件执行全面的系统扫描。紧接着,需要对浏览器的缓存数据以及Cookies文件进行清理。在IE浏览器界面中,通过访问“工具”菜单并选择“Internet选项”,然后在弹出的设置界面中,切换至“常规”标签页,并执行清除浏览历史记录的操作,此过程应包含Cookies和临时互联网文件。倘若上述步骤均未能解决问题,那么可以考虑禁用或移除那些可能引发冲突的浏览器附加组件。相关操作需要在“工具”菜单下找到并打开“管理加载项”,对可疑的插件进行禁用处理,并在浏览器重新启动后再次尝试执行重置操作。再者,修复IE浏览器相关的注册表配置也是至关重要的环节。注册表编辑器是一个功能强大的系统工具,任何不当的操作都可能导致严重的系统问题,因此在进行修改前必须创建系统还原点作为安全备份。用户可以通过按下“Win+R”组合...

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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