首页 新闻 会员 周边

EF MySQL 批量操作有哪些方法

1
悬赏园豆:100 [待解决问题]

EF 自己的批量操作效率低下,一些第三库大多也只支持sql server ,请问有比较方便使用的 支持EF MySQL 批量操作的类库或者方法么,谢谢

静下来的颜色的主页 静下来的颜色 | 初学一级 | 园豆:5
提问于:2018-11-14 11:37
< >
分享
所有回答(2)
0

可以绕过EF,比如mysql支持高速从csv文件插入数据

会长 | 园豆:12401 (专家六级) | 2018-11-14 11:56
2
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'),... ;
悟行 | 园豆:12559 (专家六级) | 2018-11-14 11:56

ZZZ 的 Entity Framework Extensions 我知道是支持的 但是这个方案目前是收费的 - -
免费版本的 EntityFramework-Plus 好像只支持 sql server 并且不支持批量插入的操作

支持(0) 反对(0) 静下来的颜色 | 园豆:5 (初学一级) | 2018-11-14 12:02

@静下来的颜色: 另外两种方法也很快,特别是第三种方法

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2018-11-14 12:02

@静下来的颜色: 第一种方法例子:

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; }
支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2018-11-14 12:05

谢谢答复,我的需求可能更复杂一点,不仅仅是批量增加,是对于增加,删除,修改(包括部分字段)都有批量的需求,想在数据层做统一的封装,除了原生的sql , 以及去除EFd的模型跟踪,非付费的方案还有其他的么,接触的MySQL 比较少

支持(0) 反对(0) 静下来的颜色 | 园豆:5 (初学一级) | 2018-11-14 12:14

@静下来的颜色: 这个和mysql本身没有多少关系,sqlserver也可以用上面几种方法;上面三种方法都是思路;假如你的数据不需要实时进入数据库,也可以搞个定时器,晚上做大量数据操作;

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2018-11-14 13:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册