ASP.NET Core 2.1 Ссылка на ApplicationDbContext из библиотеки классов - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть эти 2 проекта App.ClassLibrary и App.Data

Я следовал этому руководству https://garywoodfine.com/using-ef-core-in-a-separate-class-library-project/, чтобы переместить свои миграции и модели в App.ClassLibrary.Одним из таких шагов было создание ApplicationDbContext в библиотеке классов:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
    public DbSet<Users> Users { get; set; }
    public DbSet<UserRoles> UserRoles { get; set; }
    public DbSet<Applications> Applications { get; set; }
    public DbSet<Roles> Roles { get; set; }
    public DbSet<EventLogs> EventLogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.HasDefaultSchema(schema: DatabaseGlobals.SchemaName);
        modelBuilder.Entity<Users>();
        modelBuilder.Entity<UserRoles>();
        modelBuilder.Entity<Applications>();
        modelBuilder.Entity<Roles>();
        modelBuilder.Entity<EventLogs>();
        base.OnModelCreating(modelBuilder);
    }

    public override int SaveChanges()
    {
        Audit();
        return base.SaveChanges();
    }

    public async Task<int> SaveChangesAsync()
    {
        Audit();
        return await base.SaveChangesAsync();
    }

    private void Audit()
    {
        var entries = ChangeTracker.Entries().Where(x => x.Entity is Users && (x.State == EntityState.Added || x.State == EntityState.Modified));
        foreach (var entry in entries)
        {
            if (entry.State == EntityState.Added)
            {
                ((Users)entry.Entity).CreatedOn = DateTime.UtcNow;
            }
        ((Users)entry.Entity).UpdatedOn = DateTime.UtcNow;
        }
    }
}

В App.Data я пытаюсь сослаться на ApplicationDbContext, но пока это не работает

private ApplicationDbContext dbContext = new ApplicationDbContext();

Раньше у меня был похожий проект в ASP.NET MVC 5 с ApplicationDBContext, подобным этому:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public virtual DbSet<AspNetUsersExtendedDetails> AspNetUsersExtendedDetails { get; set; }
    public virtual DbSet<AspNetApplications> AspNetApplications { get; set; }
    public virtual DbSet<AspNetEventLogs> AspNetEventLogs { get; set; }
    public virtual DbSet<AspNetRolesExtendedDetails> AspNetRolesExtendedDetails { get; set; }
    public virtual DbSet<AspNetUserRolesExtendedDetails> AspNetUserRolesExtendedDetails { get; set; }
    public virtual DbSet<AspNetUserAccessTokens> AspNetUserAccessTokens { get; set; }
    public ApplicationDbContext() : base("ManagementStudio")
    {

    }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

}

Я мог бы использовать

private ApplicationDbContext dbContext = new ApplicationDbContext();

без проблем, но теперь я догадываюсьиз-за разных версий и фреймворка его не работает.Не уверен, что я могу сделать, чтобы получить dbcontext.

РЕДАКТИРОВАТЬ:

Это ошибка, которую я получаю в моем приложении .Net Core 2.1

Нет аргумента, чтосоответствует обязательному формальному параметру 'options' для 'ApplicationDbContext.ApplicationDbContext (DbContextOptions)'

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Ваш DbContext в порядке, но вы должны зарегистрировать его с помощью внедрения зависимостей и внедрить его в ваши классы вместо использования нового.

Ваш метод startup.cs ConfigureServices должен иметь вашу базу данных сСтрока подключения.

services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

Затем в классах, которые вы хотите использовать (например, Controller), вы вводите его в конструктор.

public class HomeController : Controller
{
    private readonly ApplicationDbContext _db;

    public HomeController(ApplicationDbContext db)
    {
        _db = db;
    }
}
0 голосов
/ 28 сентября 2018

Ваш ApplicationDbContext должен быть:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public virtual DbSet<AspNetUsersExtendedDetails> AspNetUsersExtendedDetails { get; set; }
    public virtual DbSet<AspNetApplications> AspNetApplications { get; set; }
    public virtual DbSet<AspNetEventLogs> AspNetEventLogs { get; set; }
    public virtual DbSet<AspNetRolesExtendedDetails> AspNetRolesExtendedDetails { get; set; }
    public virtual DbSet<AspNetUserRolesExtendedDetails> AspNetUserRolesExtendedDetails { get; set; }
    public virtual DbSet<AspNetUserAccessTokens> AspNetUserAccessTokens { get; set; }
    public ApplicationDbContext(DbContextOptions options) : base(options)
    {

    }
}

И вы должны зарегистрировать его так, в зависимости от используемого вами сервера БД, для SqlServer:

services.AddDbContext<ApplicationDbContext>(options =>  
    options.UseSqlServer(Configuration.GetConnectionString("DbContext"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...