Ошибка. Не удалось установить инициализатор базы данных типа MyNamespace.MyCustomInitializer, MyAssembly не удалось загрузить тип MyContext.

Я создаю веб-приложение, используя .NET4.5 с Entity Framework 6 alpha3, которое использует новую базу данных SQL Compact. База данных еще не существует.

У меня есть следующий код в веб-форме:

public IQueryable<Job> listJobs_GetData()
{
    var db = new JournalistContext();
    IQueryable<Job> query = db.Jobs.Where(d => d.JobStart > DateTime.Now)
        .OrderBy(s => s.JobStart)
        .Take(10);
    return query;
}

где JournalistContext является производным от DbContext. Он создает экземпляр JournalistContext в порядке, но при выполнении следующей строки выдает исключение ниже. Я предполагаю, что поскольку база данных не существует, она пытается вызвать инициализатор, но это не удается.

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Failed to set database initializer of type 'TSJ.Models.MyCustomInitializer, TSJ' for DbContext type 'TSJ.JournalistContext, TSJ' specified in the application configuration. See inner exception for details.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.Internal.InitializerConfig.TryGetInitializer(Type requiredContextType, String contextTypeName, String initializerTypeName, Boolean isDisabled, Func`1 initializerArgs, Func`3 exceptionMessage)
       at System.Data.Entity.Internal.InitializerConfig.<>c__DisplayClass6.<TryGetInitializerFromEntityFrameworkSection>b__1(ContextElement e)
       at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
       at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
       at System.Data.Entity.Internal.InitializerConfig.TryGetInitializerFromEntityFrameworkSection(Type contextType)
       at System.Data.Entity.Internal.InitializerConfig.TryGetInitializer(Type contextType)
       at System.Data.Entity.Config.AppConfigDependencyResolver.GetServiceFactory(Type type, String name)
       at System.Data.Entity.Config.AppConfigDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 t)
       at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
       at System.Data.Entity.Config.AppConfigDependencyResolver.GetService(Type type, Object key)
       at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
       at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
       at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
       at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
       at System.Data.Entity.Config.CompositeResolver`2.GetService(Type type, Object key)
       at System.Data.Entity.Config.IDbDependencyResolverExtensions.GetService(IDbDependencyResolver resolver, Type type)
       at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
       at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
       at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
       at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
       at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
       at System.Data.Entity.Internal.InternalContext.Initialize()
       at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
       at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
       at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
       at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
       at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)
       at TSJ.MainOverview.listJobs_GetData() in ....\Visual Studio 2012\Projects\TSJ\TSJ\MainOverview.aspx.cs:line 27
  InnerException: System.TypeLoadException
       HResult=-2146233054
       Message=Could not load type 'TSJ.JournalistContext' from assembly 'TSJ'.
       Source=mscorlib
       TypeName=TSJ.JournalistContext
       StackTrace:
            at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
            at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
            at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
            at System.Type.GetType(String typeName, Boolean throwOnError)
            at System.Data.Entity.Internal.InitializerConfig.TryGetInitializer(Type requiredContextType, String contextTypeName, String initializerTypeName, Boolean isDisabled, Func`1 initializerArgs, Func`3 exceptionMessage)

Как описано здесь http://msdn.microsoft.com/en-us/data/jj556606 Я создал пользовательский инициализатор базы данных, который в настоящее время является пустым классом:

    internal sealed class MyCustomInitializer : MigrateDatabaseToLatestVersion<JournalistContext, TSJ.Migrations.Configuration>
    {

    }

    public class JournalistContext : DbContext 
    {
        public JournalistContext() : base("TSJ")
        {
        }
...

Мой файл web.config ссылается на этот инициализатор следующим образом:

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <contexts>
      <context type="TSJ.JournalistContext, TSJ">
        <databaseInitializer type="TSJ.Models.MyCustomInitializer, TSJ" />
      </context>
    </contexts>
    <providers>
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </providers>
  </entityFramework>

Я в тупике! Любые идеи?

Еще я заметил: эти строки появились в моем файле web.config. Я не знаю, как они были добавлены и почему.

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>

большое спасибо, Марк.


person Mark Shaw    schedule 11.04.2013    source источник
comment
Я мало работал с EF 6, но, похоже, он не может найти ваш тип, сборку и т. д. Попробуйте удалить «контексты» из конфигурации и вручную загрузить инициализатор, т.е. Database.SetInitializer.   -  person NSGaga-mostly-inactive    schedule 11.04.2013
comment
Хорошая идея, я поместил строку System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<JournalistContext, TheSportsJournalist.Migrations.Configuration>()); в свой метод Application_Start, и, похоже, он заработал. Я понятия не имею, почему это не сработало в файле конфигурации.   -  person Mark Shaw    schedule 12.04.2013
comment
test, проверьте, как вы определяете, что такое «полное имя» - например. попробуйте построить этот TSJ.JournalistContext из кода с помощью отражения (это то, что видит config/EF). Это должно привести вас к проблеме. Я могу дать ответ, но нам нужно больше :)   -  person NSGaga-mostly-inactive    schedule 12.04.2013


Ответы (2)


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

person Dmytro I.    schedule 26.08.2013

Моя проблема была связана с моей строкой подключения.

Чувак, попробовав следующие ссылки, я не добился успеха. Я пытался подключиться к своему экземпляру SQLEXPRESS. Я попытался:

ошибка загрузки инициализатора базы данных с помощью EF6

Сброс миграции Entity-Framework

Попробуйте это вместо этого - это, наконец, сработало для меня. Замените источник данных своим экземпляром SqlExpress/SqlServer, если вы не используете localdb.

Enable-Migrations -ConnectionString "Data Source=.\SQLEXPRESS;Initial Catalog=[your database name];User Id=[your user name];Password=[your password];Integrated Security=SSPI;" -ConnectionProviderName "System.Data.SqlClient" -Force -Verbose

Add-Migration -Name "Initial" -ConnectionString "Data Source=.\SQLEXPRESS;Initial Catalog=[your database name];User Id=[your user name];Password=[your password];Integrated Security=SSPI;" -ConnectionProviderName "System.Data.SqlClient" -Force -Verbose

Update-Database -Force -ConnectionString "Data Source=.\SQLEXPRESS;Initial Catalog=[your database name];User Id=[your user name];Password=[your password];Integrated Security=SSPI;" -ConnectionProviderName "System.Data.SqlClient" -Verbose

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

Это был ресурс, который я наконец нашел, который помог мне многое понять о том, что я делаю.

https://coding.abel.nu/2012/03/ef-migrations-command-reference/

person cr1pto    schedule 13.04.2016