如何将List重新附加到DbSet?

时间:2012-08-23 17:15:01

标签: c# .net entity-framework ef-code-first dbcontext

在处理Code First(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; }
}

我有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

在这个简单的例子中,你可以做这样的事情。

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

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

但是,这可能不适用于更复杂的情况。有几种不同的方法可以解决这个问题。

  1. 如果从数据库中自动分配了ID,您可以检查是否Entity.Id == 0,假设Id从1开始。
  2. 如果您手动分配ID,则可以查询该表以查看该ID是否不存在。
  3. 跟踪,不知何故,您决定在事后添加哪些记录。这可以通过第二个清单。您可以拥有自己的State属性,该属性不会映射到数据库。如果将实体投影到特定于应用程序的模型,这将更容易。
  4. 或者您可以将它同时添加到列表和上下文中。