代码之家  ›  专栏  ›  技术社区  ›  Kemal Tezer Dilsiz

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

  •  3
  • Kemal Tezer Dilsiz  · 技术社区  · 8 年前

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

    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);
            }
        }
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Koopakiller Geo    8 年前

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