我在我的数据库中添加了一行,并返回一个不同的上下文来更新它。我有这堂课:
public abstract partial class DataManager<I, C>
where C : class, IDomainObject, I, new( ) where I : IDomainObject
C 可能是一个 EntityObject,但这个类不知道这一点。
我的保存看起来像这样:
public virtual bool Save( I _item )
{
bool rc = true;
try
{
var set = m_Context.GetObjectSet<I, C>( );
ObjectStateEntry stateEntry = null;
if( ! m_Context.ObjectStateManager.TryGetObjectStateEntry( ( C ) _item, out stateEntry ) )
{
if( _item is EntityObject )
{
if ( _item.IsNew )
{
set.AddObject( ( C ) _item );
}
else
{
try
{
set.Attach( ( C ) _item );
}
catch( Exception ex )
{
set.ApplyCurrentValues( ( C ) _item );
}
等等...
在我的测试用例中,TryGetObjectStateEntry 找不到 stateEntry。然而,它是一个 EntityObject,并且它不是新的(IsNew 是我的标志),所以它会到达 else。这是我的问题: set.Attach 抛出此错误
“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”
下一刻,ApplyCurrentValues 抛出这个:
“在 ObjectStateManager 中找不到键与所提供对象的键匹配的对象。验证所提供对象的键值是否与必须应用更改的对象的键值匹配。”
这两者怎么可能是真的?
更多信息:
_item 是由 Get 在另一个上下文中创建的。然后处理了该上下文。那时,_item 有一个 EntityState.Unchanged。我对其进行了一些更改,并将其更改为 EntityState.Modified。(我没想到,因为上下文(及其 ObjectStateManager)应该已经消失了。)无论如何,一旦它到达 Save(上面),它的状态(由调试器报告)被修改,但我有到那时一个新的背景。如果此时我得到所有 ObjectStateEntries(已添加、已删除、已修改、未更改)的列表,则只有两个,并且 _item 不是其中之一,正如 ApplyCurrentValues 报告的那样,但它无法附加,因为“它是也在那儿!”。也许问题在于它仍然附加到旧的 ObjectStateManager (可能有一些不会让 ObjectStateManager 处理的引用?)。