EF 自己的批量操作效率低下,一些第三库大多也只支持sql server ,请问有比较方便使用的 支持EF MySQL 批量操作的类库或者方法么,谢谢
可以绕过EF,比如mysql支持高速从csv文件插入数据
context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.ValidateOnSaveEnabled = false;
设置一下这个
第二种方法(扩展):
https://archive.codeplex.com/?p=efbulkinsert
第三种方法(原始操作):
public static void BulkToMySQL() { string ConnectionString = "server=192.168.1xxx"; StringBuilder sCommand = new StringBuilder("INSERT INTO User (FirstName, LastName) VALUES "); using (MySqlConnection mConnection = new MySqlConnection(ConnectionString)) { List<string> Rows = new List<string>(); for (int i = 0; i < 100000; i++) { Rows.Add(string.Format("('{0}','{1}')", MySqlHelper.EscapeString("test"), MySqlHelper.EscapeString("test"))); } sCommand.Append(string.Join(",", Rows)); sCommand.Append(";"); mConnection.Open(); using (MySqlCommand myCmd = new MySqlCommand(sCommand.ToString(), mConnection)) { myCmd.CommandType = CommandType.Text; myCmd.ExecuteNonQuery(); } } }
最终生成的mysql语句是这样:
INSERT INTO User (FirstName, LastName) VALUES ('test','test'),('test','test'),... ;
ZZZ 的 Entity Framework Extensions 我知道是支持的 但是这个方案目前是收费的 - -
免费版本的 EntityFramework-Plus 好像只支持 sql server 并且不支持批量插入的操作
@静下来的颜色: 另外两种方法也很快,特别是第三种方法
@静下来的颜色: 第一种方法例子:
using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext();
//注意这个 context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in someCollectionOfEntitiesToInsert) { ++count; context = AddToContext(context, entityToInsert, count, 100, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext) { context.Set<Entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }
谢谢答复,我的需求可能更复杂一点,不仅仅是批量增加,是对于增加,删除,修改(包括部分字段)都有批量的需求,想在数据层做统一的封装,除了原生的sql , 以及去除EFd的模型跟踪,非付费的方案还有其他的么,接触的MySQL 比较少
@静下来的颜色: 这个和mysql本身没有多少关系,sqlserver也可以用上面几种方法;上面三种方法都是思路;假如你的数据不需要实时进入数据库,也可以搞个定时器,晚上做大量数据操作;