我正在学习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>
或其他类似的
我知道这种形式是不可能的,我怎么能这样做?