2013-04-11 61 views
4

我正在使用實體框架6 alpha3創建使用.NET4.5的Web應用程序,該實用程序使用新的SQL Compact數據庫。該數據庫尚不存在。錯誤「無法設置類型爲MyNamespace.MyCustomInitializer,MyAssembly的數據庫初始值設定項」無法加載MyContext類型

我有一個Web表單下面的代碼:

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的實例ok,但是當執行下一行時,它會拋出下面的異常。 我猜數據庫不存在,它試圖調用初始化程序,但是失敗。

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> 

非常感謝,馬克。

+0

我沒有太多的工作與EF 6 - 但現在看來,這是無法找到你的類型 - 或裝配等 - 嘗試從配置去除「背景」 - 手動加載初始化 - 即數據庫。 SetInitializer。 – NSGaga 2013-04-11 19:35:14

+0

好主意,我把行 'System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion ());我的Application_Start方法中的' ,似乎得到它的工作。我不知道爲什麼它沒有在配置文件中工作。 – 2013-04-11 23:05:54

+0

測試,檢查您如何定義,「完全限定名稱」是什麼 - 例如嘗試通過反射從代碼中構建TSJ.JournalistContext(這就是config/EF所看到的)。這應該會引起你的問題。我可以提出一些答案 - 但我們需要更多:) – NSGaga 2013-04-11 23:22:43

回答

0

我的猜測是你的初始化類是內部的。在我的項目中,我從另一個程序集加載它,但無法看到它。一旦我變成公衆,它就像魔術一樣工作。 我認爲即使你在同一個裝配中擁有一切,它也許是真的。

0

我的問題與我的連接字符串有關。

男人,在嘗試以下鏈接後,我沒有成功。我試圖連接到我的SQLEXPRESS實例。我想:

error loading database initializer with EF6

Reset Entity-Framework Migrations

試試這個 - 這個終於爲我工作。如果您不使用localdb,請將數據源替換爲您的SqlExpress/SqlServer實例。

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/

相關問題