繁体   English   中英

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

[英]Entity Framework and Generics for bulk methods

我已经将应用程序从Linq To Sql迁移到了Entity Framework。

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

当我们使用链接到sql时,我们可以使用一些批量操作,例如

以下代码段:

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

db1_context.MyTable.InsertAllOnSubmit(listaMyTable );

这样就可以将寄存器从databaseContext1批量插入到databaseContext2

将应用程序迁移到Entity Framework 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;
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM