C#CodeSmith LINQ到SQL问题删除操作

C#CodeSmith LINQ到SQL问题删除操作,c#,asp.net,linq,linq-to-sql,codesmith,C#,Asp.net,Linq,Linq To Sql,Codesmith,在我正在进行的项目中,我需要从数据库中删除一个“用户”。这个“用户”有两个表引用它的外键。当硬删除时,我尝试从表A和表B中删除对“用户”具有外键的所有记录,然后删除该“用户”记录。这一切都是在存储库中使用对象工厂完成的 代码如下: public void RemoveUserByUserId(int userId) { var user = m_context.User.GetByKey(userId); ObjectFactory.Inject(m_context); UserTokenR

在我正在进行的项目中,我需要从数据库中删除一个“用户”。这个“用户”有两个表引用它的外键。当硬删除时,我尝试从表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());
}
出于隐私原因,我不得不输入XXXX。我读到的是,尽管LINQ正在存储为SQL准备的更改,但它将其放入字典中,不知何故,这两件事的键是相同的,并且在更改发生之前它会出错


任何帮助都将不胜感激。

我有点像是在黑暗中拍摄的,假设你读到的是正确的,同时我也经历了一些痛苦

您要从中删除的表是否有自己的主键,或者是否使用外键作为主键?(好吧,你知道我的意思……听起来他们并没有自己的独立唯一主键,linq知道)'

linq使用GetHash方法从主键字段构造唯一的id。。我猜这些字段是重复的,因此字典问题。。。问题不是由具有相同密钥id的两个不同表引起的

我猜这些表中的多个项目是在一对多对中的一种。一个快速而肮脏的修复方法是向它们添加一个自动递增列,并将其分配给主键(否则,尝试使用多字段pk——我还没有用linq Deliberralley真正尝试过)


我希望这能给你一些想法。。。您可以在分部类中重写GetHashCode,以另一种方式解决问题。。。但是,您应该只包括单个项目中不变的部分数据)

这是一个老问题,但是我们无法同时对两个表进行删除。我们的解决方案是先从一个表中删除另一个表,然后提交中间的更改。

实际上每个表都有一个主键。结构如下。用户表[pk:User\u id]用户令牌表-[pk:token\u id(guid)][fk:User\u mapping\u id][fk:User\u id]用户映射表-[pk:User\u mapping\u id][fk:User\u id]
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)