1

我正在学习 c# 语言,在阅读了特定的手册之后,我正在尝试编写一个应用程序,该应用程序将在 sql server CE 数据库中写入数据。我采用了代码优先的方法,因此我开始编写域类,并在第一次数据访问 SDF 文件时成功创建数据库。我的问题与一些继承的类有关。我有这样的情况

  public class Fruit
  {
    //some properties here
  }

  public class Orange: Fruit { }
  public class Apple: Fruit { }

//...

  public class AAContext : DbContext
  {
    public AAContext()
      : base("name=AAdata")
    {
    }
        public DbSet<Orange> Oranges { get; set; }
        public DbSet<Apple> Apples { get; set; }

        // other code...
  }

我这样做是因为如果我使用一个类(水果)来注册一个以上的实体,编译器会告诉我这是不可能的

现在,当我在 winform 中编写代码(为所有 Fruit 类输入数据的单一表单)以读取/修改每个表中的数据时,我必须从代​​码中绑定数据网格和字段;对于追加/删除数据,我不知道如何访问已注册的 DbSet(Oranges 和 Apples)或如何将它们作为构造函数的参数传递给表单。我做了一些实验,我的结果是:

我不能直接传递(给表单构造函数)一个 objet DbSet<Fruit>,它返回一个转换错误,所以......我可以传递一个IEnumerable<Fruit>(参数给构造函数(使用协方差),我可以将它分配给网格的数据源,它有效。但是......我怎样才能添加/删除/修改数据?

所以,我的问题是:如何绑定 winform 控件以及如何在不知道从我想使用的基类(水果)继承的特定类(橙色或苹果)的情况下执行数据库操作?

从一开始,我的意图就是为按钮(在 MainForm 中)编写代码(例如)

public MainForm()
{
  InitializeComponent();
  dbConn = new DataLayer.AAContext();
}

private void button1_Click(object sender, EventArgs e)
{
  var fruitArchive = dbConn.Apples;
  var newWindow = new ArchiveForm(fruitArchive , "Apple's archive");
  newWindow.ShowDialog(this);
}

以及带有重载构造函数的 ArchiveForm ......

public ArchiveForm(DbSet<DataLayer.Fruit> domainClass, string Title)
  : this()
{
  dataGridView.DataSource = domainClass.ToList();
  this.Text = Title;
}

并将 domainClass 保存在 ArchiveForm 中,以使用它来添加、删除、修改数据,将其视为 aDbSet<Fruit>或其他类似的东西

我知道这种形式是不可能的,我该怎么做?

4

0 回答 0