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();
}
答案 0 :(得分:10)
嗯,根据作为EF权威的Julie Lerman,您应该只在迁移中使用AddOrUpdate
方法,请检查blog post:
&#34;它适用于迁移期间播种数据。看起来像 添加到您的应用中的一种不错的方法,但这不是它的目的。&#34;
...
首先,它将在您的数据库中执行查询以查找记录 你作为一个键提供的任何东西(第一个参数)匹配
AddOrUpdate
中提供的映射列值(或值)。所以这 是一个松散的小鹅匹配,但播种非常好 设计时间数据。
正如您所看到的,它有额外的成本,因为在添加或更新之前,它会执行查询,如果该记录已经存在。因此,最好的方法是使用您在帖子末尾提到的代码。