1

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

我们使用此应用程序在两个 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);

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

4

1 回答 1

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;
} 
于 2013-05-23T08:52:07.510 回答