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

时间:2013-05-23 07:32:26

标签: c# entity-framework generics entity-framework-5

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

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

当我们使用Link to 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);

我不知道如果我说清楚了。如果您需要更多信息,请询问。

1 个答案:

答案 0 :(得分:0)

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

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;
}