批量方法的实体框架和泛型

本文关键字:框架 泛型 实体 方法 | 更新日期: 2023-09-27 18:15:01

我已经将一个应用程序从Linq到Sql迁移到实体框架。

我们使用这个应用程序在两个sql服务器之间同步注册表。

当我们使用Link to sql时,我们可以使用一些批量操作,比如

下面的代码片段:

List<MyTable> listaMyTable = (from p in db1_context.MyTable
                                                select p).ToList();
db1_context.MyTable.InsertAllOnSubmit(listaMyTable );

允许我们从databaseContext1批量插入寄存器到databaseContext2

一旦我将应用程序迁移到实体框架5,我看到没有所以我决定做一些通用的方法,像这样:

 public static int  InsertAllOnSubmit<T>(this ObjectContext db, List<T> newentities) where T : EntityObject
        {
            var objectSet = db.CreateObjectSet<T>();
            newentities.ForEach(x => objectSet.AddObject(x));
            int inserted = db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
            return inserted;
        }  
        public static int DeleteAllOnSubmit<T>(this ObjectContext db, List<T> deleteEntities) where T : EntityObject
        {
            var DelSet = db.CreateObjectSet<T>();
            deleteEntities.ForEach(x => DelSet.DeleteObject(x));
            int deleted= db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
            return deleted;
        }

我也可以这样做:

//Using AsNoTracking to disable tracking between contexts
 List<MyTable> listaMyTable = (from p in db1_context.MyTable.AsNoTracking()
                                                    select p).ToList();
 db2_context.InsertAllOnSubmit(listamyTable);

我想知道他们是否有任何方法通过泛型,同样的事情我已经做了,但加载像List<List<T>>这样的东西,所以我可以迭代所有表并进行批量操作。

就像

EntitiesList.add(Entity);
EntitiesList.add(Entity2);
EntitiesList.add(Entity3);

创建一个泛型方法,遍历实体,并为列表中的每个类型创建ObjectSet。

所以我可以输入

 dbContext.InsertAllEntities(EntitiesList);

我不知道我是否说清楚了。

批量方法的实体框架和泛型

您可以使用dynamic数据类型在运行时为每个IList<>解析T的类型。

public static void InsertAllListsOnSubmit(
    this ObjectContext db, IList<IList<object>> lists)
{
    foreach (IList<object> list in lists)
    {
        if (list.Count > 0)
        {
            dynamic instance = list[0];
            db.InsertAllOnSubmit(instance, list);
        }
    }
}

并更改您的方法签名以采用T

的虚拟实例
public static int  InsertAllOnSubmit<T>(
    this ObjectContext db, T instance, IList<T> newentities)
    where T : EntityObject
{
    var objectSet = db.CreateObjectSet<T>();
    newentities.ForEach(x => objectSet.AddObject(x));
    int inserted = db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    return inserted;
}