Отделение ASP.NET Core 2.1 от библиотеки классов Entity Framework - PullRequest
0 голосов
/ 15 ноября 2018

Когда вы читаете этот вопрос, вы думаете, что это повторяющийся вопрос, и что я недостаточно занимался поиском решения этой проблемы. К сожалению, я потратил много часов на поиски решения этой проблемы. Я занимаюсь разработкой приложения ASP.NET Core 2.1, которое состоит в основном из ASP.NET Web APP и Entity Framework Core.

Я использую первый подход кода для добавления миграций и обновления базы данных, и все выглядит нормально, пока я не отделил основное веб-приложение asp.net от ядра Entity Framework. На самом деле, я поместил EntityFrameworkCore в отдельную библиотеку классов. Когда я пытался добавить новую миграцию, используя

dotnet ef migrations add InitialCreate

У меня была эта ошибка

Произошла ошибка при доступе к IWebHost в классе «Программа». Продолжая без поставщика услуг приложения. Ошибка: не удалось загрузить тип 'EF.EFCore.ApplicationDbContext' из сборки 'ef, версия = 2.1.4.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60'. System.TypeLoadException: не удалось загрузить тип 'EF.EFCore.ApplicationDbContext' из сборки 'EF, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null'. в System.Reflection.CustomAttribute._CreateCaObject (RuntimeModule pModule, IRuntimeMethodInfo pCtor, байт ** ppBlob, байт * pEndBlob, Int32 * pcNamedArgs) в System.Reflection.CustomAttribute.CreateCaObject (модуль RuntimeModule, IRuntimeMethodInfo ctor, IntPtr & blob, IntPtr blobEnd, Int32 & namedArgs) в System.Reflection.CustomAttribute.GetCustomAttributes (RuntimeModule decorModule, Int32 decorMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, логическое значение mustBeInheritable, IList производные атрибуты) в System.Reflection.CustomAttribute.GetCustomAttributes (тип RuntimeType, тип RuntimeType caType, логическое наследование) в System.Attribute.GetCustomAttributes (элемент MemberInfo, тип Type, логическое наследование) в System.Attribute.GetCustomAttribute (элемент MemberInfo, тип attributeType, логическое наследование) в System.Reflection.CustomAttributeExtensions.GetCustomAttribute [T] (элемент MemberInfo) в Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations. <> c.b__12_5 (TypeInfo t) в System.Linq.Enumerable.WhereSelectListIterator 2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator 1.MoveNext () в System.Linq.Enumerable.ConcatIterator 1.MoveNext() at System.Linq.Enumerable.DistinctIterator 1.MoveNext () в System.Linq.Enumerable.WhereEnumerableIterator 1.MoveNext() at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextTypes() at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextType(String name) at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_1.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0 1.b__0 () в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (Действие действия) Не удалось загрузить тип 'EF.EFCore.ApplicationDbContext' из сборки 'EF, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль'.

Я уверен, что проблема связана с разделением проекта на форму компонента

services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(conString,builder => builder.MigrationsAssembly(typeof(Startup).Assembly.FullName)));

приведенный выше код - это код, который я использую для своего класса ApplicationDBContext, который является производным от IdentityContext, добавьте или удалите MigrationAssembly, от этого ничего не меняется. Кроме того, добавление IDbContextFactory не имеет большого значения Я изменил ApplicationDbContext, производный от IdentityContext, на следующий

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    // Entity
    string conString = "Server=(local); Database=OnlineStoreDB;User Id=sa;Password=123@asu;";

    optionsBuilder.UseSqlServer(conString, x => x.MigrationsAssembly("EF"));

    base.OnConfiguring(optionsBuilder);
    // base.OnConfiguring(optionsBuilder);
    //if (!optionsBuilder.IsConfigured)
    //{
    //    optionsBuilder.UseSqlServer(conString);
    //}
    //else
    //{
    //    optionsBuilder.UseSqlServer(conString);
    //}

}

1 Ответ

0 голосов
/ 13 января 2019

Наш подход заключался в создании небольшой библиотеки-помощника со следующим содержанием:

public class ApiDbContextMigrationsFactory : IDesignTimeDbContextFactory<ApiDbContext>
{
    public ApiDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ApiDbContext>();
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Api.Local.Migration;Trusted_Connection=True;ConnectRetryCount=0",
            b => b.MigrationsAssembly(typeof(ApiDbContext).Assembly.FullName));

        return new ApiDbContext(optionsBuilder.Options);

    }
}

И затем мы создаем миграцию изнутри HelperForMigrations-Library-Folder с помощью следующей команды:

dotnet ef migrations add nameofMigration --startup-project ./ --project ../ApiDbContextProject --context ApiDbContext

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...