1

アプリケーションを Linq To Sql から Entity Framework に移行しました。

このアプリケーションを使用して、2 つの 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

データ型を使用して、実行時にfor eachdynamicの型を解決できます。TIList<>

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 に答える