如何使用 Entity Framework Core 将 SQL 数据从一个表传输到另一个表

Posted

技术标签:

【中文标题】如何使用 Entity Framework Core 将 SQL 数据从一个表传输到另一个表【英文标题】:How to transfer SQL data from one table to another using Entity Framework Core 【发布时间】:2019-09-10 14:53:45 【问题描述】:

我的数据库中有两个表包含相同的列。 TBL 1 和 TBL 2 是历史表。当我将数据输入 TBL 1 时,我想使用 EF Core 2.2 将所有数据从 TBL 1 移动到 Tbl 2(作为历史数据)。

我不想编写不必要的循环来使代码变得丑陋。

var MyEntity = new MyEntities();
var TBL1 = MyEntity.TBL1.Find();
var TBL2 = new TBL2();

TBL2.CurrentValues.SetValues(TBL1); 
//CurrentValues is not accept in code. Giving me build error

MyEntity.TB2.Add(data2);
MyEntity.TB1.Remove(data1);
MyEntity.SaveChanges();

我只需要使用 EF 将 SQL 数据从表 1 复制到表 2 并避免循环。任何带有映射器的示例或任何有效的东西都会有所帮助。

【问题讨论】:

EF 不太适合处理批量操作,例如复制整个数据表。这仍然是“原始”T-SQL 的亮点。 完全同意@marc_s。 了解一些有关投影的知识:) @Kaps26:我知道这个问题很老,但您有 2 个答案 - 请您将一个标记为已接受? 【参考方案1】:

为您的 TBL2 模型添加导航属性:

public TBL1 TBL1  get; set; 

像这样向您的 TBL1 模型添加投影:

public static Expression<Func<TBL1, TBL2>> Projection

    return tbl1 => new TBL2
    
        Prop1 = tbl1.Prop1,
        Prop2 = tbl1.Prop2,
        TBL1 = tbl1,
    ;

并使用投影来生成 TBL1 和 TBL2 的实例,如下所示:

var MyEntity = new MyEntities();
var tbl2 = MyEntity.TBL1.Where(x => x.Id == id).Select(TBL1.Projection).SingleOrDefault();
vat tbl1 = tbl2.TBL1;

MyEntity.TB2.Add(tbl2);
MyEntity.TB1.Remove(tbl1);
MyEntity.SaveChanges();

【讨论】:

【参考方案2】:

我假设你不想仅仅为了复制数据而改变你的表模型,你想从一个表复制到另一个,可能到另一个数据库。

所以你可以试试这样的东西。使用 ClearTable 使目标表为空,然后复制项目:

void ClearTable<T>(System.Data.Linq.Table<T> tbl, bool submitChanges = true)
where T : class

    tbl.DeleteAllOnSubmit(tbl);
    if (submitChanges) ctxSrc.SubmitChanges();


void CopyTable<T>(System.Data.Linq.Table<T> srcTbl, 
                  System.Data.Linq.Table<T> tgtTbl, bool submitChanges = true)
    where T : class

    ClearTable(tgtTbl, submitChanges);
    foreach (var element in srcTbl.Select(s => s).ToList())
    
        tgtTbl.Append(element);
    
    if (submitChanges) ctxTgt.SubmitChanges();

示例 1:从一个表复制到另一个(同一个数据库)

CopyTable(ctxSrc.Products1, ctxSrc.Products2);

示例 2:从一个数据库复制到另一个数据库

CopyTable(ctxSrc.Products, ctxTgt.Products);

这假设您有两个数据库上下文:ctxSrcctxTgt,并且您希望从源上下文复制到目标上下文。


注意事项:

上面的代码在复制之前从目标表中删除项目。如果您只想附加数据,请评论 ClearTable 调用。

该示例不考虑依赖关系,例如外键关系。如果需要,您必须将其添加到代码中。例如,以正确的顺序复制表格很重要。如果您有指向另一个表的外键,则必须先复制该表。类似的规则适用于删除包含外键的行。

如果您有很多元素,请考虑更频繁地提交。此示例将在提交之前将所有元素保存在内存中。您可以通过分页来实现这一点。为此,您可以附加 .Skip(n).Take(m) 方法。

除了 SQL,Entity Framework (Core) 不知道任何真正的批量操作。即使tbl.DeleteAllOnSubmit(tbl) 看起来像一个(它是一种集成方法),它也会在内部循环所有元素以删除它们。

【讨论】:

以上是关于如何使用 Entity Framework Core 将 SQL 数据从一个表传输到另一个表的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 学习系列 - 认识理解Entity Framework

如何使用 Entity Framework Core 模拟异步存储库

如何使用 Entity Framework 生成和自动递增 Id

如何使用 Entity Framework Core 正确保存 DateTime?

如何使用 Entity Framework Core 获取主键值

如何在 Entity Framework 6 中使用 DbDataReader 获取表名?