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...
  }

これを作成したのは、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>または同様のもののように扱います

このフォームではそれが不可能であることはわかっています。どうすればできますか?

4

0 に答える 0