【问题标题】:Recreate database when model changes模型更改时重新创建数据库
【发布时间】:2013-08-15 19:21:31
【问题描述】:

在 C# Web Api 项目中,我有一些模型类(例如 Customer 和 Info)

public class Customer
{
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long OrderId { get; set; }
    [Required]
    public string CompanyName { get; set; }
}

public class Info
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }
    [Required]
    public Customer Customer { get; set; }
    public string Property { get; set; }
    public string Value { get; set; }
}

在开发过程中,它们经常会发生变化,所以我想在模型发生变化时删除并重新创建数据库。

你是怎么设置的?据我了解,为了插入一些初始数据,有种子方法,但它属于哪个类,这个方法在哪里调用?

【问题讨论】:

    标签: c# entity-framework asp.net-web-api


    【解决方案1】:

    设置database initializer。如果您想在模型更改时删除现有数据库并重新创建它,请使用 DropCreateDatabaseIfModelChanges 初始化程序:

    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourContext>());
    

    如果你想用一些数据为数据库播种,那么创建你自己的初始化器并覆盖种子方法:

    public class YourInitializer : DropCreateDatabaseIfModelChanges<YourContext>
    {
        protected override void Seed(YourContext context)
        {
            context.Foos.Add(new Foo());
            // ...
            context.SaveChanges();
            base.Seed(context);
        }
    }
    

    并使用这个初始化器:

    Database.SetInitializer(new YourInitializer());
    

    【讨论】:

    • Entity Framework 如何知道它应该从 YourInitializer 而不是另一个类中获取种子方法?
    • @user2558051 这个方法是虚拟的,EF 从基础 DropCreateDatabaseIfModelChanges 类调用这个方法,如果你重写了它的实现,你的方法将被调用
    • 为了测试,我向两个模型类添加了一个属性public string Test { get; set; }。在 Global.asax 我粘贴了 Database.SetInitializer&lt;InfoesContext&gt;(new InfoesContextInitializer()); public class InfoesContextInitializer : DropCreateDatabaseIfModelChanges&lt;InfoesContext&gt; { protected override void Seed(InfoesContext context) { Customer google = new Customer() { OrderId = 1, CompanyName = "Google Inc." }; context.Customers.Add(google); base.Seed(context); }
    • 但是,表 Customer 和 Info 的列没有改变,也没有调用种子方法。我错过了什么?
    • 我已经在一个新的空解决方案中尝试了您的答案,当然它确实有效。在我的项目的其他地方一定有我的错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多