我正在使用数据库作为一种缓存 - 目的是存储当前已知的“事实”(细节不是那么有趣)。然而,至关重要的是,我想避免插入重复的事实。为此,当前数据访问代码在许多地方使用insert或ignore。
我想使用实体框架从它的可管理性中受益;我已经有足够的编写样板代码用于另一个微妙的不同查询,到目前为止,实体框架对查询的支持看起来很棒。
但是,我似乎无法真正找到添加新事实的良好支持 - 显而易见的方法似乎是简单地在.NET中构建新实体,将它们添加到模型中,并将更改保存到数据库中。但是,这意味着我需要提前检查特定行是否已经存在,因为它是否允许插入。在最好的时候,这意味着额外的往返,但它通常更糟糕:以前这个代码高度并行 - 偶尔重复插入无关紧要,因为数据库会忽略它 - 但现在我不仅需要检查是否事先存在一行,我需要在更小的批次中执行此操作(由于事务开销通常会慢很多倍)因为并行插入中只有一个已存在的行将导致整个事务的回滚。
那么,有没有人知道如何使用实体框架获得类似的行为?
具体来说,我希望能够执行多个插入并让数据库简单地忽略那些不可能的插入 - 或者更一般地说,能够表达服务器端冲突解决代码以避免不必要的往返和交易。
如果重要,我正在使用SQLite。
答案 0 :(得分:1)
此功能可以通过存储过程(实体框架可以使用)在支持它的数据库(例如MSSQL)上实现。在SQLite上,不支持这些。但是,sqlite也存在一个简单的解决方案,即使用如下的触发器:
CREATE TRIGGER IF NOT EXISTS MyIgnoreTrigger BEFORE INSERT ON TheTable
FOR EACH ROW BEGIN
INSERT OR IGNORE
INTO TheTable (col1, col2, col3)
VALUES (NEW.col1, NEW.col2, NEW.col3);
select RAISE(IGNORE);
END;
或者,可以设置触发器以直接验证约束,并且仅在违反约束时引发“忽略”。