我可以使用代码

时间:2017-05-25 00:38:41

标签: c# entity-framework ef-migrations

我正在使用实体框架代码第一种方法,并具有以下模型和数据库上下文。

public class Patient
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
    }

  public class PatientContext:DbContext
    {
        public DbSet<Patient> Persons { get; set; }
    }

现在要在数据库中创建模型,我必须运行Enable Migration,如果有任何更改,则必须使用包管理器控制台运行Update database

但是我有什么方法可以使用代码。因此,当有人运行控制台应用程序时,它将创建所有表模式。

class Program
    {
        static void Main(string[] args)
        {
           //Code to Create my tables 
           //Something similar to enable migration and update database
        }
    }

我可以在主应用程序中创建一个记录并创建表结构,但创建一个创建表结构的记录似乎是多余的。此外,如果有任何模式更改,以下代码将引发异常。

有更好的方法吗?

static void Main(string[] args)
        {
            using (PatientContext pcontext = new DatabaseMigApp.PatientContext())
            {
                pcontext.Patients.Add(new Patient() { FirstName = "Steve",Id = 1});
                pcontext.SaveChanges();

            }
        }

1 个答案:

答案 0 :(得分:3)

是的,有。您必须首先从包管理器控制台运行Enable-Migrations -EnableAutomaticMigrations,以便它按如下方式生成Configuration类:

internal sealed class Configuration : DbMigrationsConfiguration<DatabaseMigApp.PatientContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DatabaseMigApp.PatientContext context)
    {
    }
}

然后您可以按如下方式更新Program.cs,以根据您的模型更改自动迁移到最新版本:

using System.Data.Entity;
class Program
{
    static void Main(string[] args)
    {
        using (PatientContext pcontext = new DatabaseMigApp.PatientContext())
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<PatientContext, Configuration>());
            pcontext.Database.Initialize(true);
        }
    }
}

如果您不希望使用自动迁移并手动生成它们(以获得更多控制权),则可以在每次更改模型时关闭自动迁移和添加迁移。在运行控制台应用程序时,program.cs中的代码仍然足以更新数据库。

详细了解自动迁移here