如何在传递DbContext基构造函数参数时修改它

本文关键字:参数 构造函数 修改 DbContext | 更新日期: 2023-09-27 18:02:07

在这个项目中,我试图从。net迁移到。net Core。这里我有一个代码,我想在。net Core中实现。

public partial class CompanyFormsContext : DbContext
{
    public CompanyFormsContext()
        : base("name=CompanyFormsContext")
    {
    }
    public CompanyFormsContext(string connName)
        : base("name=" + connName)
    {
    }
...
}

在。net Core中,string不被接受作为DbContext的参数。相反,您可以将DbContextOptions作为参数传递。例如:http://ef.readthedocs.io/en/latest/miscellaneous/configuring-dbcontext.html

你可以看到这个例子:

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    { }
    public DbSet<Blog> Blogs { get; set; }
}

var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Filename=./blog.db");
using (var context = new BloggingContext(optionsBuilder.Options))
{
    // do stuff
}

我想做的与此类似。我可以创建DbContextOptions的实例并传递它,但我不知道如何修改SqlServer连接,因为我通过基类构造函数传递它。

我不能弄清楚的最重要的事情是,我想要能够保持我的空构造函数,这将触发一个默认的"CompanyFormsContext"连接。如果我可以简单地更改连接名称,同时将其作为CompanyFormsContext构造函数的参数传递,那就太好了。

我正在考虑以下方法作为基构造函数的替代方法,但我更愿意保留基构造函数的功能。

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (connName == null)
        {
            optionsBuilder.UseSqlServer(@"Server=.';Integrated Security=True;Database=CompanyFormsContext");
        }
        else
        {
            optionsBuilder.UseSqlServer(@"Server=.';Integrated Security=True;Database=" + connName);
        }
    }

如何在传递DbContext基构造函数参数时修改它

您可以创建一个静态方法,该方法将从传递的连接字符串中创建一个DbContextOptions<BloggingContext>

那么你的类可以像这样:

public partial class CompanyFormsContext : DbContext
{
    public CompanyFormsContext()
        : base(CreateOptions(null))
    {
    }
    public CompanyFormsContext(string connName)
        : base(CreateOptions(connName))
    {
    }
    private static DbContextOptions<BloggingContext> CreateOptions(string connName)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlite("Filename=./blog.db");
        if (connName == null)
        {
            optionsBuilder.UseSqlServer(@"Server=.';Integrated Security=True;Database=CompanyFormsContext");
        }
        else
        {
            optionsBuilder.UseSqlServer(@"Server=.';Integrated Security=True;Database=" + connName);
        }
        return optionsBuilder.Options;
    }