在这个项目中,我试图从.NET迁移到.NET Core。在这里,我有一个要在.NET Core中实现的代码。

public partial class CompanyFormsContext : DbContext
{
    public CompanyFormsContext()
        : base("name=CompanyFormsContext")
    {
    }

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


在.NET Core中,字符串不作为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);
        }
    }

最佳答案

您可以创建一个静态方法,该方法返回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;
    }

10-01 22:12
查看更多