Код EF 4.1 Первое создание таблиц в SQL Server 2008 - PullRequest
0 голосов
/ 24 января 2012

Сначала я использую код EF 4.1 с SQL Server 2008 R2.

Я написал свой DbContext следующим образом:

public class DataAccessContext : DbContext
{
    public DbSet<TipoJob> TipoJobs { get; set; }
    public DbSet<Usuario> Usuarios { get; set; }
    public DbSet<Telefone> Telefones { get; set; }
    public DbSet<Job> Jobs { get; set; } 

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

И в global.asax я его инициализировал:

Database.DefaultConnectionFactory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["DataAccessContext"].ConnectionString);
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DataAccessContext>());

Но мои таблицы не создаются, и я получаю следующую ошибку:

Совместимость модели не может быть проверена, поскольку тип EdmMetadata не был включен в модель. Убедитесь, что IncludeMetadataConvention был добавлен в соглашения DbModelBuilder.

У меня уже есть созданная база данных и пользователь, который является владельцем этой базы данных, но у пользователя нет разрешения на удаление или создание базы данных.

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 3 ]

2 голосов
/ 24 января 2012

У меня уже есть созданная база данных и пользователь, который является владельцем этой базы данных, но у пользователя нет разрешения на удаление или создание базы данных.

В этом проблема,Все встроенные инициализаторы поддерживают только сценарий, где база данных не существует.Если база данных существует, ваш инициализатор считает, что она также содержит таблицы и ищет таблицу EdmMetadata для сравнения хэша текущей модели с сохраненным.

Вам нужно либо удалить базу данных и позволить вашему приложению создать ее, либо вы должны создать пользовательскийинициализатор, использующий разрешение только на создание таблиц в существующей базе данных (если вам нужно какое-либо обновление БД, вам также потребуется реализовать эту логику) - здесь является некоторым примером.

0 голосов
/ 24 января 2012

Инициализатор попытается удалить и заново создать базу данных, однако, как вы сказали, пользователю это запрещено.Так что да, вы получите ошибки.

Одной из таблиц, которые EF CodeFirst пытается создать, является таблица EdmMetadata - она ​​в основном просто хранит хэш текущей модели, чтобы помочь ей проверить, изменилась модель или нет,Поскольку пользователь вашей базы данных не может удалить базу данных, EF не инициализирует эту таблицу - следовательно, ошибка.

Если вы используете существующую базу данных, вы должны удалить таблицу метаданных так же, как вы удаляетемножественное наименование:

builder.Conventions.Remove<IncludeMetadataConvention>();

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

0 голосов
/ 24 января 2012

Измените DropCreateDatabaseIfModelChanges на DropCreateDatabaseAlways и запустите его один раз, затем верните обратно

Похоже, что модель не была изменена, но таблицы или что-то было отредактировано вручную или таблица EdmMetaData была удалена

О!И убедитесь, что это не в прямом эфире!Это приведет к удалению и повторному созданию всех таблиц, поэтому убедитесь, что у вас есть хороший способ заполнить их данными.

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