在一个项目中,我正在研究我需要从我的数据库中删除“用户”。此“用户”有两个表引用它的外键。当困难删除时,我正在尝试从表A和表B中删除所有记录,对“用户”具有外键,然后删除“用户”记录。这一切都在存储库中完成,并使用对象工厂。

代码如下:

public void RemoveUserByUserId(int userId)
{
var user = m_context.User.GetByKey(userId);

ObjectFactory.Inject(m_context);

UserTokenRepository.RemoveUserTokensByUserId(userId);
UserMappingRepository.RemoveUserMappingsByUserId(userId);

m_context.User.DeleteOnSubmit(user);

m_context.SubmitChanges();

ObjectFactory.ResetDefaults();
}

public static void RemoveUserTokensByUserId(int userId)
{
var dataContext = ObjectFactory.GetInstance<DataContext>();
var userTokens = dataContext.UserToken.ByUserId(userId);
dataContext.UserToken.DeleteAllOnSubmit(userTokens.AsEnumerable());
}

public static void RemoveUserMappingsByUserId(int userId)
{
var dataContext = ObjectFactory.GetInstance<DataContext>();
var userMappings= dataContext.UserMapping.ByUserId(userId);
dataContext.UserMapping.DeleteAllOnSubmit(userMappings.AsEnumerable());
}
.

如果每个表有一个记录,它可以正常工作。如果一个表有多个,只能在usertoken和usermappings上发生,我收到以下错误。

System.ArgumentException was unhandled by user code
Message=An item with the same key has already been added.
  Source=mscorlib
  StackTrace:
       at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
       at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
       at System.Data.Linq.ChangeProcessor.EdgeMap.Add(MetaAssociation assoc, TrackedObject from, TrackedObject to)
       at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
       at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
       at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
       at XXXX.XXXX.XXXX.XXXXDataContext.SubmitChanges(ConflictMode failureMode) in XXXX:line 519
       at System.Data.Linq.DataContext.SubmitChanges()
       at XXXX.UserRepository.RemoveUserByUserId(Int32 userId) in XXXX:line 146
       at XXXX(Int32 profileUserId) in XXXX:line 948
       at XXXX(Int32 profileUserId) in XXXX:line 165
       at SyncInvokeUnregisterUserForActivationFailed(Object , Object[] , Object[] )
       at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
       at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
.

我必须放在xxxx中以获取隐私原因。我读到这一点,这就是LINQ存储准备SQL的更改它将其放入字典中,并且某种东西的键是相同的,并且在发生更改之前的错误是相同的。

将非常感谢任何帮助。

有帮助吗?

解决方案 2

这是一个古老的问题,但我们从来没有能够同时向两个表中的删除。我们的解决方案是从一个删除,然后删除另一个并提交之间的变化。

其他提示

我有点在黑暗中拍摄,并假设你如何阅读它是正确的,而我沿途的稍微痛苦。

要从有自己的主键删除您删除的表,还是使用外键作为PK? (好吧,你知道我的意思......它听起来不像他们拥有自己的独立独立的主键,Linq知道)'

linq使用gethash方法从主键字段构建唯一ID。我猜测这些字段复制并因此重复并因此是字典问题...问题不是由具有相同密钥ID的2个不同表引起的。

我猜测这些表格中的多个项目是一种在很多到多个连接的中间。一个快速且肮脏的修复是向他们添加一个自动增量列,将其分配给主键(否则尝试使用多字段PK - 我没有用LINQ Deliberatley尝试)。

我希望这给了你一些想法......你可以在部分类中覆盖gethashcode来解决其他方式...但是你应该只包括一个不变的数据的数据的部分,单个项目

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top