【问题标题】:ASP.NET Core 2.1 Referring to ApplicationDbContext from Class LibraryASP.NET Core 2.1 从类库中引用 ApplicationDbContext
【发布时间】:2019-03-04 14:33:34
【问题描述】:

我有这两个项目 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 应用程序中遇到的错误

没有给出与“ApplicationDbContext.ApplicationDbContext(DbContextOptions)”所需的形参“options”相对应的参数

【问题讨论】:

  • 为什么不起作用?你有错误吗?什么错误? BTW ASP.NET Core 广泛使用依赖注入,并且上下文是 injected 的。你不应该有这样的私有字段。 ASP.NET Core 知道注入的上下文并在请求结束时关闭它们。它不知道您的 dbContext 字段
  • 没有给出与'ApplicationDbContext.ApplicationDbContext(DbContextOptions)'的所需形参'options'相对应的参数这是错误
  • 我不确定应该在 app.data 声明中插入哪些参数
  • 一个options 参数。这就是为什么您不应该尝试创建这样的存储库。检查Configuring a DbContext。它显示了如何在服务配置部分配置上下文选项。 ASP.NET Core 将使用该信息来构造上下文并将其注入到您的控制器中
  • 对不起,我很困惑。我现在正在看指南。在这种情况下,我的 blog.db 会是什么?

标签: c# asp.net asp.net-mvc asp.net-core


【解决方案1】:

您的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"))

【讨论】:

  • DbSet 属性不必必须是虚拟的。除非使用依赖注入,否则注册它将不起作用。强类型的 DbContextOptions 也没有什么问题。
【解决方案2】:

您的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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2019-05-28
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多