1

コードファースト(EF 4.3)を扱う場合、List<T>からを操作してDbSet<T>、変更をリストに保持する方法はありますか?

例えば...

class Program {
    static void Main(string[] args) {
        Database.SetInitializer(new DropCreateDatabaseAlways<Context>());
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

        using (Context c = new Context()) {

            // Works
            c.Entities.Add(new Entity());

            // Doesn't work
            List<Entity> entities = c.Entities.ToList();
            entities.Add(new Entity());

            // Somehow attach the new unattached elements?

            c.SaveChanges();

            Console.WriteLine(c.Entities.Count()); // Prints 1
            Console.ReadLine();
        }
    }
}

class Context : DbContext {
    public DbSet<Entity> Entities { get; set; }
}

class Entity {
    public int Id { get; set; }
    public int Foo { get; set; }
}

これを行う方法はありますか?

4

1 に答える 1

1

この些細な例では、次のようなことができます。

foreach(Entity entity in entities)
{
     var entry = c.Entry(entity);

     if (entry.State == EntityState.Detached)
     {
         c.Entities.Add(entry);
     }
}

ただし、これはおそらくより複雑なシナリオでは機能しません。これを解決するには、いくつかの異なる方法があります。

  1. Idがデータベースから自動割り当てされている場合、Entity.Id == 0Idが1から始まると仮定して、かどうかを確認できます。
  2. IDを手動で割り当てる場合は、テーブルにクエリを実行して、IDが存在しないかどうかを確認できます。
  3. どういうわけか、事後に追加されたレコードを追跡します。これは、2番目のリストを介して行われる可能性があります。データベースにマップされない独自のStateプロパティを持つことができます。これは、エンティティをアプリケーション固有のモデルに投影する場合に簡単です。
  4. または、リストとコンテキストに同時に追加することもできます。
于 2012-08-23T18:17:23.913 に答える