EF:在迁移之外使用DbSet <t> .AddOrUpdate()是否可以?

时间:2015-07-07 15:07:05

标签: entity-framework

EntityFramework Migrations在DbSet<T>上提供了一种扩展方法,专门用于在迁移期间播种数据:

void AddOrUpdate<TEntity>(this IDbSet<TEntity> set, params TEntity[] entities);

在“常规”代码中使用是否安全,即不能在迁移期间播种数据?

var blog = ...//detached instance from a request

using (var context = new BloggingContext()) 
{ 
    context.Blogs.AddOrUpdate(blog); 
    context.SaveChanges(); 
} 

它似乎工作正常,但我想知道它与“传统的”'分离实体'场景相比是否有任何缺点 - 例如,如on MSDN所述(文章的最后部分):

using (var context = new BloggingContext()) 
{ 
    context.Entry(blog).State = blog.BlogId == 0 ? 
                               EntityState.Added : 
                               EntityState.Modified; 

    context.SaveChanges(); 
} 

1 个答案:

答案 0 :(得分:10)

嗯,根据作为EF权威的Julie Lerman,您应该只在迁移中使用AddOrUpdate方法,请检查blog post

  

&#34;它适用于迁移期间播种数据。看起来像   添加到您的应用中的一种不错的方法,但这不是它的目的。&#34;

     

...

     

首先,它将在您的数据库中执行查询以查找记录   你作为一个键提供的任何东西(第一个参数)匹配   AddOrUpdate中提供的映射列值(或值)。所以这   是一个松散的小鹅匹配,但播种非常好   设计时间数据。

正如您所看到的,它有额外的成本,因为在添加或更新之前,它会执行查询,如果该记录已经存在。因此,最好的方法是使用您在帖子末尾提到的代码。