C# 处理在数据库中更新/删除但不在linq缓存中的对象

C# 处理在数据库中更新/删除但不在linq缓存中的对象,c#,linq-to-sql,stored-procedures,datacontext,C#,Linq To Sql,Stored Procedures,Datacontext,我有一个非常复杂的问题,在这个系统中,当用户使用asp webforms提交页面时,许多存储过程都会运行。它将更新或删除相关表中的某些项,但由于这一切都发生在存储过程中,linq to sql不知道这种逻辑,因此它的缓存仍然存在,删除的项也在缓存中 我看到的问题是,一个基于复合键的表正在更新,因此所有内容都通过存储过程删除,然后重新创建项并插入新值,但是如果您假设实体如下所示: public class SomeCompositeEntity { public long UserId {

我有一个非常复杂的问题,在这个系统中,当用户使用asp webforms提交页面时,许多存储过程都会运行。它将更新或删除相关表中的某些项,但由于这一切都发生在存储过程中,linq to sql不知道这种逻辑,因此它的缓存仍然存在,删除的项也在缓存中

我看到的问题是,一个基于复合键的表正在更新,因此所有内容都通过存储过程删除,然后重新创建项并插入新值,但是如果您假设实体如下所示:

public class SomeCompositeEntity
{
    public long UserId {get;set;}
    public smallint ActionTypeId {get;set;}
    public int ActionValue {get;set;}
}
因此,在本例中,如果我有10个,更新了3个,所有这些都将通过此存储过程删除,然后重新创建,其中7个与现有的相同,3个是相同的ID,但值不同

问题是,由于删除只发生在DB空间中,linq没有意识到这一点,因此当您试图保存linq to sql仍然拥有的这些实体时,它会出现DuplicateKeyException,这是正确的

因此,如果我捕获DuplicateKeyException,然后获取实体并告诉linq to sql刷新它,覆盖数据库中的更改,那么如果对象已被删除,它会从缓存中删除该对象吗?因为文件上不清楚吗


我很想删除存储过程和许多其他复杂的过程,但客户端坚持认为,如果它以某种方式触发了几天的结束,就不能更改它。。。因此,考虑到我现在的处境,如果有任何关于如何处理这种情况的其他想法,那就太好了。

目前我不得不做一件讨厌的事情。。。并在每次保存之前清空Linq的缓存。我试图对异常作出反应并处理它,但我无法更新对象,因为它处于已更改的状态,因此我尝试采取主动并阻止异常发生,但这需要我检查项目是否在缓存中,如果是,则删除它们或交换/合并它们,错误仍然存在

因此,不管怎样,这是我最终使用的代码,虽然很糟糕,但确实起到了作用,因为当我实现Ninject(具有基于请求的作用域)时,我也将转向短期连接,希望这将不再是一个问题

public static void ClearEntityCache(this IDataContext dataContext)
        {
            const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            var method = dataContext.GetType().GetMethod("ClearCache", flags);
            method.Invoke(dataContext, null);
        }
上面的IDataContext是我为模拟数据层进行单元测试而制作的一个简单包装器接口