【问题标题】:Move complete table to archive in MVC 4将完整表移动到 MVC 4 中的存档
【发布时间】:2014-01-17 17:31:17
【问题描述】:

我正在处理一个 MVC 4 项目,该项目需要我将数据从活动表移动到存档内容的表中。

我了解实体框架,表格与模型紧密结合。我创建了两个模型 - 一个用于活动记录,一个用于存档记录。

将活动表中的所有数据添加到存档和删除活动表中的所有内容以供重新使用的最佳方法是什么?

P.S:我对这里的容错性有点偏执,因为我一次可能要处理大约 30000 条记录。我需要成功地将所有记录移动到存档,并确保只有在成功复制后才能将其删除。

【问题讨论】:

    标签: sql-server asp.net-mvc entity-framework asp.net-mvc-4


    【解决方案1】:

    即使您使用的是实体框架,您仍然可以使用存储过程。这是使用存储过程的好案例,因为您可以在存储过程中执行基于集合的操作(快),而不是遍历代码中的所有记录(慢)。

    以下是如何将存储过程添加到 EF 的一些步骤(您也可以谷歌一下):Adding stored procedures complex types in Entity Framework

    你的存储过程可能看起来像:

    SET IDENTITY_INSERT ON dbo.ArchiveTable --Assuming you have an identity column
    INSERT INTO dbo.ArchiveTable(
        Col1
       ,Col2
    )
    SELECT 
       Col1
       ,Col2
    FROM dbo.MainTable
    
    SET IDENTITY_INSERT OFF dbo.ArchiveTable --Assuming you have an identity column
    
    DELETE * FROM dbo.MainTable
    

    将其包装在一个事务中(以满足您的容错能力),这对于 30,000 多条记录来说应该是一个非常快速的执行过程。我建议您返回受影响的记录数之类的信息,您应该能够从存储过程中返回所有这些信息。

    【讨论】:

    • 效果最好。现在,我正在从代码本身发送一个自定义查询 INSERT INTO。与存储过程相比,这将如何影响性能?在上面的存储过程中,我的查询与您的查询相同。
    • @Omkar 我不知道这两种方式的性能优势。从理论上讲,我认为它们会相似。我不知道如何在 EF 中执行此操作,所以也许您正在使用不同类型的连接(例如 ADO.NET)将该查询发送到数据库?如果是这种情况,我仍然建议使用存储过程的方式来使您的代码更易于维护;这意味着以后必须编辑您的应用程序的任何人都可以依赖 EF 作为与数据库的唯一连接。这不是必须的,但如果这是我的项目,我会期待它。否则,请注释掉它以使其清楚。
    • 在代码中使用 INSERT INTO 查询要考虑的另一件事是,现在您的 .NET 代码现在更加依赖于该架构。如果数据库架构发生更改,则必须更新这部分代码以及 EF。然而,如果你把它放在一个存储过程中,你只需更新 EF。
    【解决方案2】:

    除非您必须这样做,否则不要在代码中执行此操作 - wilsjd 的答案是正确的 - 创建一个您直接从 EF 调用的事务存储过程。

    但是,如果您有理由在代码中执行此操作 - 比如说因为您没有从存储过程中访问两个表的好方法,请务必从内部了解并正确处理事务你的代码。这是一个很好的答案,讨论这个: Entity Framework - Using Transactions or SaveChanges(false) and AcceptAllChanges()

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多