私は 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...
}
これを作成したのは、1 つのクラス (フルーツ) を使用して複数のエンティティを登録すると、コンパイラがこれは不可能であると言うからです。
今、winform (すべての Fruit クラスのデータ入力を行う単一のフォーム) でコードを書いて、すべてのテーブルのデータを読み取り/変更するとき、コードからデータグリッドとフィールドをバインドする必要があります。データの追加/削除については、登録された DbSet (オレンジとリンゴ) にアクセスする方法や、コンストラクターのパラメーターとしてフォームに渡す方法がわかりません。私はいくつかの実験を行いました、私の結果は次のとおりです。
object を (フォーム コンストラクターに) 直接渡すことはできませんDbSet<Fruit>
。キャスト エラーが返されるため、IEnumerable<Fruit>
(共分散を使用して) (パラメーターをコンストラクターに渡すことができ、これをグリッドのデータ ソースに割り当てることができます。しかし...どうすればデータを追加/削除/変更できますか?
したがって、私の質問は次のとおりです。どのようにwinformコントロールをバインドし、使用したい基本クラス(Fruit)から継承された特定のクラス(OrangeまたはApple)を最初から知らずにデータベース操作を実行するにはどうすればよいですか?
当初から、私の意図は、(メインフォーム内の) ボタンのコード (たとえば) を書くことでした。
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 内に保存して、それを使用してデータを追加、削除、変更するか、DbSet<Fruit>
または同様のもののように扱います
このフォームではそれが不可能であることはわかっています。どうすればできますか?