我已将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);
我不知道如果我说清楚了。如果您需要更多信息,请询问。
答案 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;
}