что может привести к тому, что EF Code First IDatabaseInitializer InitializeDatabase не будет вызван? - PullRequest
4 голосов
/ 05 декабря 2011

У меня есть пользовательские настройки инициализатора следующим образом:

public class PromptIfChangesNeededDBInitializer : IDatabaseInitializer<MeyerREContext>
{

    public PromptIfChangesNeededDBInitializer()
    {  // This constructor is called properly

    }

    #region IDatabaseInitializer<TContext> Members


    public void InitializeDatabase(MeyerREContext context)
    { // This is never called

       ... Code that checks existence and seeds etc

    }

 }

Вот мой класс DbContext

public class MeyerREContext : DbContext
{
    static MeyerREContext()
    {
        Database.SetInitializer(new PromptIfChangesNeededDBInitializer());
    }

    public DbSet<Address> Addresses { get; set; }
    ... More DbSet property definitions


protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

       modelBuilder.Configurations.Add(new AddressMap());
      ... More Configurations 

    }

}

Это первый вызов контекста

City city = dbNew.Cities.Where(e=>e.CityName=="Foley").FirstOrDefault();

Конструктор Initializer вызывается правильно, что подтверждается точкой останова, OnModelCreating работает правильно, что подтверждается точкой останова, но после завершения OnModelCreating InitializeDatabase никогда не вызывается ...

Я удалил Database.SetInitializer (новый вызов PromptIfChangesNeededDBInitializer ()) из ctor DBContext в ctor вызывающего класса ДО любых вызовов контекста, и теперь я получаю немного другое поведение:

public class CreateData
{

    private VFPModelContainer db = new VFPModelContainer();
    private MeyerREContext dbNew;

    public CreateData()
    {
        Database.SetInitializer(new PromptIfChangesNeededDBInitializer<MeyerREContext>());

        dbNew = new MeyerREContext();
        dbNew.Database.Initialize(force: true);   NUll Exception here now...

    }

В коде EF Framework теперь генерируется нулевое исключение:

Вот деталь исключения:

System.NullReferenceException occurred
Message=Object reference not set to an instance of an object.
Source=EntityFramework
StackTrace:
   at    
    System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.NavigationPropertyConfiguration.ValidateConsistency(NavigationPropertyConfiguration navigationPropertyConfiguration)

InnerException:

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

How can I get more info than is shown in the Intellitrace ?

Как получить больше информации о том, что пошло не так внутри EF? Мне нужно знать, с какими навигационными свойствами возникают проблемы ... Я думаю, проблема в том, что EF создает фоновые рабочие потоки для создания и проверки модели, но я не понимаю, почему исключение слишком неопределенное ??

Есть идеи?

Спасибо Грег

1 Ответ

4 голосов
/ 07 декабря 2011

пришлось установить Reflector и декомпилировать сборку EF, чтобы выяснить, в чем проблема:

Эта строка вызывает проблему ...

private void ValidateConsistency(NavigationPropertyConfiguration navigationPropertyConfiguration)
{
  if ((navigationPropertyConfiguration.InverseEndKind.HasValue && this.EndKind.HasValue) && (navigationPropertyConfiguration.InverseEndKind != this.EndKind))
  {
    throw System.Data.Entity.ModelConfiguration.Resources.Error.ConflictingMultiplicities(this.NavigationProperty.Name, this.NavigationProperty.ReflectedType);
  }
  if ((navigationPropertyConfiguration.EndKind.HasValue && this.InverseEndKind.HasValue) && (navigationPropertyConfiguration.EndKind != this.InverseEndKind))
  {
    throw System.Data.Entity.ModelConfiguration.Resources.Error.ConflictingMultiplicities(this.InverseNavigationProperty.Name, this.InverseNavigationProperty.ReflectedType);
  }

В моем случаеСвойство InverseNavigationProperty имеет значение null, что приводит к возникновению исключения. КОГДА EF пытается вызвать исключение ...

Основная проблема заключается в том, что у меня определено отношение обратной характеристики, но для него не определено отображение ...

Однако было невозможно определить, какой объект вызывал эту проблему ... Эти проверки в этом методе должны быть обернуты попыткой перехвата, чтобы избежать этой проблемы, чтобы они могли выдать более значимую ошибку конечному пользователю ...

Спасибо, Грег

...