1

在处理 Code First (EF 4.3) 时,有没有办法使用 a List<T>from a 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 是从数据库自动分配的,您可以检查 if Entity.Id == 0,假设 Id 从 1 开始。
  2. 如果您手动分配 Id,则可以查询表以查看 Id 是否不存在。
  3. 以某种方式,您决定跟踪哪些记录是事后添加的。这可以通过第二个列表。您可以拥有自己的不映射到数据库的 State 属性。如果您将实体投影到特定于应用程序的模型上,这会更容易。
  4. 或者您可以同时将其添加到您的列表和上下文中。
于 2012-08-23T18:17:23.913 回答