如何使用 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);
这假设您有两个数据库上下文:ctxSrc
和 ctxTgt
,并且您希望从源上下文复制到目标上下文。
注意事项:
上面的代码在复制之前从目标表中删除项目。如果您只想附加数据,请评论 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?