2017-01-27 48 views
2

我正在開發基於nopCommerce的項目。爲了更新自定義實體,我想啓用EF遷移。於是我運行以下命令:在程序集中找不到上下文類型EF6

Enable-Migrations -StartUpProjectName nop.web -ContextProjectName Nop.Plugin.Payments.Deposit -verbose 

並且得到錯誤:

Using StartUp project 'Nop.Web'. 
System.Data.Entity.Migrations.Infrastructure.MigrationsException: No context type was found in the assembly 'Nop.Plugin.Payments.Deposit'. 
    at System.Data.Entity.Utilities.TypeFinder.FindType(Type baseType, String typeName, Func`2 filter, Func`2 noType, Func`3 multipleTypes, Func`3 noTypeWithName, Func`3 multipleTypesWithName) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.GetContextTypeRunner.Run() 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.GetContextType(String contextTypeName) 
    at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName) 
    at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0() 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
No context type was found in the assembly 'Nop.Plugin.Payments.Deposit'. 

上下文類定義如下:

public class DepositTransactionObjectContext : DbContext, IDbContext 
{ 
    public DepositTransactionObjectContext(string nameOrConnectionString) : base(nameOrConnectionString) { } 

    public DepositTransactionObjectContext() { } 

    public IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) where TEntity : BaseEntity, new() 
    { 
     throw new System.NotImplementedException(); 
    } 

    public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = null, params object[] parameters) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public void Detach(object entity) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public bool ProxyCreationEnabled { get; set; } 
    public bool AutoDetectChangesEnabled { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new DepositTransactionMap()); 

     base.OnModelCreating(modelBuilder); 
    } 

    public string CreateDatabaseInstallationScript() 
    { 
     return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript(); 
    } 

    public void Install() 
    { 
     //It's required to set initializer to null (for SQL Server Compact). 
     //otherwise, you'll get something like "The model backing the 'your context name' context has changed since the database was created. Consider using Code First Migrations to update the database" 
     Database.SetInitializer<DepositTransactionObjectContext>(null); 

     Database.ExecuteSqlCommand(CreateDatabaseInstallationScript()); 
     SaveChanges(); 
    } 

    public void Uninstall() 
    { 
     this.DropPluginTable("DepositTransaction"); 
    } 

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity 
    { 
     return base.Set<TEntity>(); 
    } 
} 

我已經創建了空項目,並啓用遷移有。然後,我已經複製並調整Configuration.cs所以它看起來是這樣的:

namespace Nop.Plugin.Payments.Deposit.Migrations 
{ 
    using Data; 
    using System.Data.Entity.Migrations; 

    internal sealed class Configuration : DbMigrationsConfiguration<DepositTransactionObjectContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
     } 

     protected override void Seed(DepositTransactionObjectContext context) 
     { 
     } 
    } 
} 

然而,當我運行Add-遷移我獲得以下錯誤:

Using StartUp project 'Nop.Web'. 
Using NuGet project 'Nop.Plugin.Payments.Deposit'. 
System.Data.Entity.Migrations.Infrastructure.MigrationsException: No migrations configuration type was found in the assembly 'Nop.Plugin.Payments.Deposit'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration). 
    at System.Data.Entity.Utilities.TypeFinder.FindType(Type baseType, String typeName, Func`2 filter, Func`2 noType, Func`3 multipleTypes, Func`3 noTypeWithName, Func`3 multipleTypesWithName) 
    at System.Data.Entity.Migrations.Utilities.MigrationsConfigurationFinder.FindMigrationsConfiguration(Type contextType, String configurationTypeName, Func`2 noType, Func`3 multipleTypes, Func`3 noTypeWithName, Func`3 multipleTypesWithName) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.FindConfiguration() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run() 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Scaffold(String migrationName, String language, String rootNamespace, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges) 
    at System.Data.Entity.Migrations.AddMigrationCommand.<>c__DisplayClass2.<.ctor>b__0() 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
No migrations configuration type was found in the assembly 'Nop.Plugin.Payments.Deposit'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration). 

我讀了很多同樣的問題,無處不在的原因是在Enable-Migrations cmdlet中指定的錯誤項目(沒有定義上下文的項目)。但你可以看到,這不是我的情況。

還有什麼可能的原因?

回答

2

Soooo我設法解決了這個問題。

爲了調查,我已經下載了實體框架的源代碼,並檢查了異常堆棧中提到的所有方法。在該方法中System.Data.Entity.Utilities.TypeFinder.FindType我發現這樣的指令:

var types = _assembly.GetAccessibleTypes() 
           .Where(t => baseType.IsAssignableFrom(t)); 

導致我GetAccessibleTypes()方法,我發現這一點:

return assembly.DefinedTypes.Select(t => t.AsType()); 

有DefinedTypes在System.Reflection.Assembly類的屬性,我試圖通過加載我總成PowerShell和獲取此屬性手動得到這個屬性:

$a = [System.Reflection.Assembly]::LoadFrom("P:\nopCommerce\Presentation\Nop.Web\Plugins\Payments.Deposit\Nop.Plugin.Payments.Deposit.dll") 
$a.DefinedTypes 

結果是EMP因爲根本沒有類型。

所以我就先種不同的方式:

$a.GetTypes() 

結果是一個錯誤:

Exception calling "GetTypes" with "0" argument(s): "Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information."

當我檢查LoaderException財產,我發現以下幾點:

$Error[0].Exception.InnerException.LoaderExceptions 

Could not load file or assembly 'Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da' or one of its dependencies. The system cannot find the file specified. Could not load file or assembly 'Nop.Services, Version=3.8.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

看起來。NET試圖加載所有的程序集,我的程序集依賴於並且當然不能,因爲它們不在同一個文件夾中,因爲它們是共享的,位於其他位置並且由啓動項目加載,而不是由我的。

因此,我已將所有必需的程序集複製到與我的文件夾相同的文件夾,並嘗試再次啓用遷移。這一次它沒有任何錯誤!

我問自己,爲什麼Enable-Migrations無法加載所有這些程序集本身,因爲它需要考慮啓動項目。但這是一個小問題。

0

您還需要添加-ProjectName參數以指定希望遷移的位置。例如:

Enable-Migrations -ProjectName Nop.Plugin.Payments.Deposit -StartUpProjectName nop.web -ContextProjectName Nop.Plugin.Payments.Deposit -verbose 

它應該默認爲您在控制檯窗口中選擇的項目。 https://coding.abel.nu/2012/03/ef-migrations-command-reference/

+0

我也試過。結果是一樣的。 – Ralfeus

相關問題