【问题标题】:Entity Framework: equivalent of INSERT OR IGNORE实体框架:相当于 INSERT OR IGNORE
【发布时间】:2009-07-17 22:37:51
【问题描述】:

我使用数据库作为一种缓存 - 目的是存储当前已知的“事实”(细节并不那么有趣)。然而,至关重要的是,我想避免插入重复的事实。为此,当前的数据访问代码在很多地方都使用了插入或忽略。

我想使用实体框架来受益于它的可管理性;我已经受够了为另一个稍微不同的查询编写样板代码,到目前为止,实体框架对查询的支持看起来很棒。

但是,我似乎真的找不到添加新事实的良好支持 - 显而易见的方法似乎是简单地在 .NET 中构造新实体,将它们添加到模型中,然后将更改保存到数据库中。但是,这意味着我需要提前检查特定行是否已经存在,因为如果确实存在,则不允许插入。在最好的情况下,这意味着额外的往返,但通常情况更糟:以前这段代码是高度并行的——偶尔的重复插入并不重要,因为数据库会忽略它——但现在我不仅需要检查是否事先存在一行,我需要以小得多的批次(由于事务开销通常会慢很多倍)这样做,因为并行插入中只有一个已经存在的行会导致整个事务的回滚。

那么,有谁知道如何使用实体框架获得类似的行为?

具体来说,我希望能够执行多次插入,并让数据库简单地忽略那些不可能的插入 - 或者更一般地说,能够表达服务器端冲突解决代码以避免不必要的往返和交易。

如果重要的话,我正在使用 SQLite。

【问题讨论】:

    标签: sql entity-framework sqlite ado.net insert


    【解决方案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;
    

    或者,触发器可以设置为直接验证约束,并且仅在违反约束时引发“忽略”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多