首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >首先使用EF代码的数据库初始化程序

首先使用EF代码的数据库初始化程序
EN

Stack Overflow用户
提问于 2017-10-13 08:02:11
回答 2查看 869关注 0票数 0

我不明白为什么我的初始化器不起作用。我首先使用EF代码创建数据库,并且在创建数据库时使用初始化器方法填充数据库中的默认值。但是,每当我尝试时,我的数据库都在创建,但是初始化器不起作用,而且表中没有数据,这些数据是我想用一些默认值初始化的。我是不是遗漏了什么?如果我错了,那么使用初始化器的正确方法是什么。

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

DataContext.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
namespace WebApplication1.Data.Model
{
    public class Category
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2017-10-16 12:36:49

将您的DataContext更改为:

代码语言:javascript
复制
public DataContext() : base("name=MyDB")
{
    Database.SetInitializer<DataContext>(new CategoryInitializer<DataContext>());
    Database.Initialize(true);
}

你的初始化器是:

代码语言:javascript
复制
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中的两个语句只是为了确保正确的迁移。

票数 0
EN

Stack Overflow用户

发布于 2017-10-19 12:19:50

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46725265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档