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

Cri*_*scu 9 entity-framework

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

void AddOrUpdate<TEntity>(this IDbSet<TEntity> set, params TEntity[] entities);
Run Code Online (Sandbox Code Playgroud)

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

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

using (var context = new BloggingContext()) 
{ 
    context.Blogs.AddOrUpdate(blog); 
    context.SaveChanges(); 
} 
Run Code Online (Sandbox Code Playgroud)

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

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

    context.SaveChanges(); 
} 
Run Code Online (Sandbox Code Playgroud)

oct*_*ccl 11

好吧,根据EF的权威Julie Lerman的说法,你应该AddOrUpdate只在迁移时使用方法,请查看这篇博文:

"它适用于迁移过程中的种子数据.它看起来像是一种很好的方法,可以添加到你的应用程序中,但这不是它的目的."

...

首先,它将在您的数据库中执行查询,查找记录,其中您作为键提供的任何内容(第一个参数)与提供的映射列值(或值)相匹配AddOrUpdate.所以这对于匹配来说有点松散 - 但是对于播种设计时间数据来说非常好.

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

  • 正确,它不是为在迁移之外使用而设计的. (2认同)