如果基于Entity Framework代码优先模型不存在,则如何自动生成.mdf db

问题描述 投票:1回答:2

我编写了模型和上下文类,成功运行了初始迁移,并在我的机器上播种并生成了本地数据库。问题是我正在大学使用Github进行协作项目,而.gitignore文件忽略了.mdf文件(原因很明显)。

我的问题:如果在.mdf文件夹中不存在qzexswpoi SQL Server数据库文件,有没有办法在app启动时自动生成和播种?

我的上下文类看起来像这样:

App_Data

连接字符串如下:

public class ABFContext : DbContext
{
    public ABFContext() : base("ABFDatabase")
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<ABFContext>());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

    public DbSet<BasketItem> BasketItems { get; set; }
    public DbSet<Catalogue> Catalogues { get; set; }
    // other entities omitted for clarity
}

迁移配置种子数据:

<connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-ABF-20190304080703.mdf;Initial Catalog=aspnet-ABF-20190304080703;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
</connectionStrings>
c# asp.net sql-server asp.net-mvc entity-framework
2个回答
0
投票

在EF 6上:使用Database.SetInitializer方法。 (未经测试的代码)

 internal sealed class Configuration : DbMigrationsConfiguration<ABF.DAL.ABFContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(ABF.DAL.ABFContext context)
    {
        context.CustomerRoles.AddOrUpdate(x => x.Id,
              new CustomerRole() { Id = 1, Role = "Member - Current" },
              new CustomerRole() { Id = 2, Role = "Member - Previous" },
              new CustomerRole() { Id = 3, Role = "Customer" },
              new CustomerRole() { Id = 4, Role = "Sponsor" },
              new CustomerRole() { Id = 5, Role = "Staff/Volunteer" }
              );

        // other seed data omitted for clarity
    }
}
class MyInitializer : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        if (context.MyEntities.Any()) return;

        // add entities here
    }
}

SetInitializer doc:class MyContext : DbContext { public MyContext() { Database.SetInitializer(new MyInitializer()); } }

IDatabaseInitializer doc:https://docs.microsoft.com/en-us/previous-versions/visualstudio/gg679461(v=vs.113)


0
投票

通过将https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.idatabaseinitializer-1?view=entity-framework-6.2.0添加到上下文类,我能够实现这一目标:

Database.Initialize(true);

将连接字符串修改为:

public class ABFContext : DbContext
{
    public ABFContext() : base("ABFDatabase")
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<ABFContext>());
        Database.Initialize(true);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

    public DbSet<BasketItem> BasketItems { get; set; }
    public DbSet<Catalogue> Catalogues { get; set; }
}

并在程序包管理器控制台中运行<add name="ABFDbConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> EF命令。这使用相同的代码优先模型在另一台机器上播种并生成update-database SQL Server数据库文件。

© www.soinside.com 2019 - 2024. All rights reserved.