Как запретить EF4.1 создавать БД, если она не существует? - PullRequest
4 голосов
/ 24 августа 2011

Я использую EF4.1 с MVC3, и мне нужно переопределить, чтобы EF не создал db, если он не существует.Вместо создания новой базы данных я хотел бы отловить ошибку и сообщить, что первоначальный каталог (имя базы данных) недопустим в строке подключения.

Однако во время разработки я хотел бы разрешить обновления для новыхклассы / свойства для создания соответствующих таблиц / столбцов в базе данных.

Есть ли здесь лучшая практика или шаблон?

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

В моем приложении я полностью отключил инициализатор контекста и обработал сопоставление базы данных и схему вручную.

Например:

public class AppDbContext : DbContext
{
    public IDbSet<Account> Accounts { get; set; }

    public AppDbContext() : base("connection_string")
    {
        Database.SetInitializer<AppDbContext>(null); // Important! Dont use entity framework initializer !important
    }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        /* Register custom mapping class */
        modelBuilder.Configurations.Add(new AccountMapper());
        base.OnModelCreating(modelBuilder);
    }
}

И настраиваемое отображение:

public class AccountMapper : EntityTypeConfiguration<Account>
{
    /// <summary>
    /// Employee entity mapper
    /// </summary>
    public AccountMapper()
    {
        ToTable("accounts");
        HasKey(x => x.Id);
        ...
    }
 }
1 голос
/ 29 сентября 2011

Я бы посоветовал изучить инициализатор базы данных EF, в частности интерфейс IDatabaseInitializer.

Если вы просто хотите, чтобы он прекратил создавать базу данных, когда она не существует, просто установите для инициализатора значение null.Но если вы хотите записать событие или что-то в этом духе, просто создайте свой собственный IDatabaseInitializer - это не сложно.

Затем вы можете установить инициализатор Application_Start в вашем global.asax.cs следующим образом.:

Database.SetInitializer(new YourCustomInitializer());

В качестве бонуса приведу пример IDatabaseInitializer, который я использую для запуска миграции баз данных (используя FluentMigrator ) ... это очень удобно, если я сам так скажу!

public class MigrationsDbContextInitializer : IDatabaseInitializer<YourDbContext>
{
    private static readonly ILog Logger = LogManager.GetLogger(typeof(MigrationsDbContextInitializer));

    public void InitializeDatabase(YourDbContext context)
    {
        var announcer = new BaseAnnouncer(x => Logger.Info(x));

        var runnerContext = new RunnerContext(announcer)
        {
            Database = "sqlserver2008",
            Connection = context.Database.Connection.ConnectionString,
            Target = "YourEntitiesNamespace",
            PreviewOnly = false,
            Task = "migrate"
        };

        new TaskExecutor(runnerContext).Execute();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...