2017-01-27 21 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-Migration я получаю следующее сообщение об ошибке:

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 (не с определением контекста). Но это не мое дело, как вы можете видеть.

Что еще может быть причиной?

ответ

2

Soooo Мне удалось решить проблему.

Для исследования я загрузил источники Entity Framework и проверил все методы, упомянутые в стеке исключений. В методе 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 

результат был эми как не было никаких типов.

Так что я пытался получить типы по-разному:

$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 пыталась загрузить все сборки, моя сборка зависела и, конечно же, не могла, поскольку они не находятся в одной папке, потому что они разделены, расположены в другом месте и загружаются пуском проекта, а не моими.

Итак, я скопировал все необходимые сборки в ту же папку, что и моя, и снова попытался активировать-Миграции. На этот раз это было выполнено без ошибок!

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

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