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

时间:2013-06-26 13:08:50

标签: c# linq-to-sql stored-procedures datacontext

我有一个非常复杂的问题,系统会在用户使用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但不同值。

问题是因为删除只发生在数据库空间中,所以linq没有意识到这一点,所以当你试图保存这些实体时,linq到sql仍然会让它乱用DuplicateKeyException,这是正确的

因此,如果我要捕获DuplicateKeyException然后获取实体并告诉linq sql刷新它覆盖来自DB的更改,它是否会从缓存中删除该对象(如果已被删除)?因为文件不清楚吗?

我很想删除存储过程和许多其他复杂的过程,但客户端坚持认为它不能被改变,因为它以某种方式触发了几天的结束...所以鉴于我在这里的位置,如果那里关于如何处理这种情况的任何其他想法那么它会很棒。

1 个答案:

答案 0 :(得分:0)

目前我不得不做一件令人讨厌的事情......并在每次保存之前清空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是一个简单的包装器接口,用于模拟数据层以进行单元测试。