使用EF Code First的数据库初始化程序

时间:2017-10-13 08:02:11

标签: c# asp.net-mvc ef-code-first

我无法弄清楚为什么我的初始化程序无法正常工作。我正在使用EF Code First来创建数据库,并且我还想使用初始化方法在数据库创建时使用默认值填充数据库。但每当我尝试时,我的数据库都在创建,但初始化程序不起作用,表中没有数据,我想用一些默认值初始化。我错过了什么吗?如果我错了,那么使用初始化器的正确方法是什么。

注意:我不想使用Configuration.cs为我的数据库设定种子,我想使用我的自定义初始化程序。

DataContext.cs

namespace WebApplication1.Data.Context
{
    public class DataContext : DbContext 
    {
       public DataContext() : base("name=MyDB")
        {
            Database.SetInitializer<DataContext>(new DropCreateDatabaseAlways<DataContext>());
        }

        public DbSet<Category> Categories { get; set; }
    }
}

CategoryInitializer.cs

namespace WebApplication1.Data.Initializers
{
    public class CategoryInitializer : DropCreateDatabaseIfModelChanges<DataContext>
    {
        protected override void Seed(DataContext context)
        {
            GetCategories().ForEach(c => context.Categories.Add(c));
            context.SaveChanges();
            base.Seed(context);
        }
        private static List<Category> GetCategories()
        {
            var categories = new List<Category>
            {
                new Category {CategoryID = 1, CategoryName = "Category 1" },
                new Category {CategoryID = 2, CategoryName = "Category 2"},
                new Category {CategoryID = 3, CategoryName = "Category 3"}
            };
            return categories;
        }
    }
}

Category.cs

namespace WebApplication1.Data.Model
{
    public class Category
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
    }
}

2 个答案:

答案 0 :(得分:0)

将您的DataContext更改为:

public DataContext() : base("name=MyDB")
{
    Database.SetInitializer<DataContext>(new CategoryInitializer<DataContext>());
    Database.Initialize(true);
}

你的初始化者:

public class CategoryInitializer<T> : DropCreateDatabaseIfModelChanges<DataContext>
{
    public override void InitializeDatabase(DataContext context)
    {
        context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction
            , $"ALTER DATABASE [{context.Database.Connection.Database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");

        base.InitializeDatabase(context);
        context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction
            , $"ALTER DATABASE [{context.Database.Connection.Database}] SET MULTI_USER WITH ROLLBACK IMMEDIATE");
    }

    protected override void Seed(DataContext context)
    {
      //Do your stuff
    }

还要注意初始化程序中的<T>InitializeDatabase中的两个陈述只是为了确保正确迁移。

答案 1 :(得分:0)

我解决了这个问题。我正在使用类库来处理所有数据。因此,为了逐步调试,我将类库的输出类型更改为Windows应用程序,并进行测试,我编写了一个类。当我逐步运行代码时,它给了我一条错误消息,即“无法删除并在sql server中创建数据库”。这意味着我的数据库正在使用中。然后我写了一个查询“使用master”,然后我再次运行。就这样。问题解决了,我的初始化程序现在正在运行。谢谢大家!