[英]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.