C# WPF 从组合框切换数据库上下文

本文关键字:数据库 上下文 WPF 组合 | 更新日期: 2023-09-27 18:30:57

我有一个ComboBox对象

<ComboBox Name="Environment">
<ComboBoxItem Content="Development"/>
<ComboBoxItem Content="Production"/>
</ComboBox> 

我希望能够根据这个组合框切换我使用的模型

namespace MyNamespace
{
    public partial class MainWindow : Window
    {
        object entity;
        private void LoadTables()
        {
            if (Environment.Text == "Production")
            {
                entity = new Entities1();
            }
            if (Environment.Text == "Development")
            {
                entity = new Entities2();
            }
            LoadTable1(); 
         }         
         private void LoadTable1()
         {
             // cannot use entity here
             entity.someTable.ToList();
         }
      }
}

问题是我无法将实体对象传递给方法,以便我可以发出数据库请求。

我尝试过使用接口,但我不确定如何实现它们。我有这个,但不确定它是否正确或如何使用它们的任何帮助将不胜感激。

    interface iMyDev
    { 
        Entities2 entity { get; set; }            
    }
    interface iMyProd
    {
        Entities1 entity { get; set; }
    }
    class MyBass:iMyDev,iMyProd
    {
       // ????
    }

C# WPF 从组合框切换数据库上下文

使用您的ComboBox示例,我认为这就是您想要做的。

首先,定义实现它的接口和类:

interface IEntity
{
  IEnumerable<object> SomeTable { get; }
}
class DevEntity : IEntity
{
  ...
}
class ProdEntity : IEntity
{
  ...
}

然后您的Window将如下所示:

namespace MyNamespace
{
    public partial class MainWindow : Window
    {
        IEntity entity;
        private void LoadTables()
        {
            if (Environment.Text == "Production")
            {
                entity = new ProdEntity();
            }
            else if (Environment.Text == "Development")
            {
                entity = new DevEntity();
            }
            LoadTable1(); 
         }
         private void LoadTable1()
         {
             entity.SomeTable.ToList();
         }
      }
}

我最终创建了一个接口类将所有属性移出模型类并移入我的界面更改了两个模型类以继承接口将接口属性添加到模型类然后更改了依赖于组合框的上下文

namespace myNamespace
{
    public partial class MainWindow : Window
    {
        public IDBContext context { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            LoadTables()
        }
        private void LoadTables()
        {
            if(cbEnvironment.Text == "Production")
            {
                context = new Entities1(); 
            }
            else 
            {
                context = new Entities2();
            }
        }
    }
    public interface IDBContext
    {
        IDbSet<Table1> Table1 { get; set; }
        IDbSet<Table2> Table2 { get; set; }        
    }
}
namespace myNamespace
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    public partial class Entities1 : DbContext, IBassContext
    {
        public Entities1()
            : base("name=Entities1")
        {
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
        public virtual IDbSet<Table1> Table1 { get; set; }
        public virtual IDbSet<Table2> Table1 { get; set; }
    }
}
namespace myNamespace
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    public partial class Entities2 : DbContext, IBassContext
    {
        public Entities2()
            : base("name=Entities2")
        {
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
        public virtual IDbSet<Table1> Table1 { get; set; }
        public virtual IDbSet<Table2> Table1 { get; set; }
    }
}