种子方法使用 AddOrUpdata 和 DropCreateAlways(Code First,EF)不断生成重复数据
Seed method keeps generating duplicate data using AddOrUpdata and DropCreateAlways (Code First, EF)
我在 EF 中使用代码优先方法为我的数据库做种时遇到问题。我发现这很奇怪,因为我使用的是 AddOrUpdate 方法。这是代码:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MovieModel
{
public class MovieContext : DbContext
{
public MovieContext() : base("name=MovieContext")
{
Database.SetInitializer<MovieContext>(new DropCreateDatabaseIfModelChanges<MovieContext>());
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Genre> Genres { get; set; }
}
}
我也尝试过使用 DropCreateDatabaseAlways 但它永远不会删除它。我还调整了我的模型,它为新的 class 生成了一个新的 table,但是旧数据仍然存在,并且再次添加了重复数据。
和种子方法和class:
namespace MovieModel.Migrations
{
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
internal sealed class Configuration : DbMigrationsConfiguration<MovieModel.MovieContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(MovieModel.MovieContext context)
{
var genres = new List<Genre>
{
new Genre{Description = "Action"},
new Genre{Description = "Thriller"},
new Genre{Description = "Fantasy"},
new Genre{Description = "Horror"},
new Genre{Description = "Science Fiction"}
};
genres.ForEach(g => context.Genres.AddOrUpdate(g));
context.SaveChanges();
}
}
}
注意:我还没有制作应用程序,到目前为止,我已经使用 Update-Database 命令使用包管理器控制台运行了它。已启用迁移。
您需要在 AddOrUpdate 中指定密钥:
genres.ForEach(g => context.Genres.AddOrUpdate(g => g.Description, g));
您也可以只检查它们是否已经存在:
if (!context.Genres.Any())
{
// Move your seed code here
}
我在 EF 中使用代码优先方法为我的数据库做种时遇到问题。我发现这很奇怪,因为我使用的是 AddOrUpdate 方法。这是代码:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MovieModel
{
public class MovieContext : DbContext
{
public MovieContext() : base("name=MovieContext")
{
Database.SetInitializer<MovieContext>(new DropCreateDatabaseIfModelChanges<MovieContext>());
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Genre> Genres { get; set; }
}
}
我也尝试过使用 DropCreateDatabaseAlways 但它永远不会删除它。我还调整了我的模型,它为新的 class 生成了一个新的 table,但是旧数据仍然存在,并且再次添加了重复数据。
和种子方法和class:
namespace MovieModel.Migrations
{
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
internal sealed class Configuration : DbMigrationsConfiguration<MovieModel.MovieContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(MovieModel.MovieContext context)
{
var genres = new List<Genre>
{
new Genre{Description = "Action"},
new Genre{Description = "Thriller"},
new Genre{Description = "Fantasy"},
new Genre{Description = "Horror"},
new Genre{Description = "Science Fiction"}
};
genres.ForEach(g => context.Genres.AddOrUpdate(g));
context.SaveChanges();
}
}
}
注意:我还没有制作应用程序,到目前为止,我已经使用 Update-Database 命令使用包管理器控制台运行了它。已启用迁移。
您需要在 AddOrUpdate 中指定密钥:
genres.ForEach(g => context.Genres.AddOrUpdate(g => g.Description, g));
您也可以只检查它们是否已经存在:
if (!context.Genres.Any())
{
// Move your seed code here
}