一种在代码优先数据库中编写更多POCO类的表单

时间:2013-10-09 14:19:36

标签: c# entity-framework code-first

我正在学习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...
  }

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

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

我无法直接传递(到表单构造函数)objet DbSet<Fruit>,它返回一个强制转换错误,所以... 我可以将IEnumerable<Fruit>(参数传递给构造函数(使用协方差),我可以将它分配给网格的数据源,它可以工作。但是...... 如何添加/删除/修改数据?

所以,我的问题是:如何绑定winform控件以及如何执行数据库操作,而不知道从一个特定类(Orange或Apple)继承的基类(Fruit)我想要使用?

从一开始我的意图就是为按钮编写代码(例如)(在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;
}

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

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

0 个答案:

没有答案