Как автоматически сгенерировать .mdf db, если он не существует, на основе модели кода в первую очередь Entity Framework - PullRequest
0 голосов
/ 05 марта 2019

Я написал модели и класс контекста, успешно выполнил начальную миграцию, посеял и сгенерировал локальную базу данных на моей машине.Проблема в том, что я работаю над совместным проектом в университете с использованием Github, а файл .gitignore игнорирует файлы .mdf (по понятным причинам).

Мой вопрос: есть ли способ автоматически генерировать и заполнять файл базы данных .mdf SQL Server при запуске приложения, если он не существует в папке 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>

Конфигурация миграции с начальными данными:

 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
    }
}

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Мне удалось добиться этого, добавив 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>

И запуск update-database EFКоманда в консоли диспетчера пакетов.Это запустило и сгенерировало файл базы данных .mdf SQL Server на другом компьютере, используя ту же модель кода в начале.

0 голосов
/ 05 марта 2019

На EF 6: Используйте метод Database.SetInitializer.(Непроверенный код)

class MyInitializer : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        if (context.MyEntities.Any()) return;

        // add entities here
    }
}
class MyContext : DbContext
{
    public MyContext()
    {
        Database.SetInitializer(new MyInitializer());
    }
}

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

IDatabaseInitializer doc: https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.idatabaseinitializer-1?view=entity-framework-6.2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...