批量方法的实体框架和泛型
本文关键字:框架 泛型 实体 方法 | 更新日期: 2023-09-27 18:15:01
我已经将一个应用程序从Linq到Sql迁移到实体框架。
我们使用这个应用程序在两个sql服务器之间同步注册表。
当我们使用Link to sql时,我们可以使用一些批量操作,比如
下面的代码片段:
List<MyTable> listaMyTable = (from p in db1_context.MyTable
select p).ToList();
db1_context.MyTable.InsertAllOnSubmit(listaMyTable );
允许我们从databaseContext1批量插入寄存器到databaseContext2
一旦我将应用程序迁移到实体框架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;
}