种子方法使用AddOrUpdata和DropCreateAlways(代码优先,EF)生成重复数据

时间:2015-02-23 15:55:09

标签: c# entity-framework ef-migrations

使用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,但它永远不会丢弃它。我还调整了我的模型,它为新类生成了一个新表,但旧数据仍然存在,并且重新添加了重复数据。

种子方法和种类:

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命令使用Package Manager Console运行它。迁移已启用。

1 个答案:

答案 0 :(得分:0)

您需要在AddOrUpdate中指定密钥:

genres.ForEach(g => context.Genres.AddOrUpdate(g => g.Description, g));

您还可以检查它们是否已存在:

if (!context.Genres.Any())
{
    // Move your seed code here
}