C# : Entity Framework(.NET Fx 3.5)についての簡単なまとめ

もういささか古い情報になってしましたが、.NET Framework 3.5 SP1のEntity Frameworkについて簡単にまとめます。

まぁ俺様用防備録。

対象となるデータの構造

説明の対象となるデータは以下のような構造を持つとします。

image

データの検索

リレーション先のデータを含めて検索(クエリー)をするにはfrom句でエンティティオブジェクトを指定するときに.Include()をつけて、検索結果に含めるリレーション先オブジェクトへのパスを指定します。

以下の例では子のShipエンティティtに対するクエリーで、関連している親のProjectエンティティのオブジェクトを含むようにLinq式で指定しています。

using (ImportEntities entity = new ImportEntities()) { 
    var ships = from s in entity.Ship.Include("Project")
                select s;
    var shipList = ships.ToList();
    foreach (var s in ships) {
        
        string message = "Project id: " + s.Project.id.ToString() +  " Ship id: " + s.id.ToString() + " Ship name: " + s.shipName;
        MessageBox.Show(message);
    }

}

また、親から子方向であれば以下のようにシンプルに書くこともできる。

var projects = from p in entity.Project
               select p;
foreach (var project in projects) {
    string message = project.id + ", " + project.projectName + "\r\n";
    foreach (var ship in project.Ship) {
        message += ship.shipName + "\r\n";
    }
    MessageBox.Show(message);
}

データの追加

親テーブルであるProjectへのデータ追加に関しては以下のようなコードになります。ADO.NETのデータセットを知っている人にとっては理解しやすいコードです。

using (ImportEntities entity = new ImportEntities()) {
    Project pro = new Project();
    pro.projectName = "ジャカルタ";
    entity.AddToProject(pro);
    entity.SaveChanges();
}

子テーブルであるShipへのデータ追加については親テーブルとのリレーション(関係)をナビゲーションプロパティを使って定義しなければならないのでやや複雑になります。

using (ImportEntities entity = new ImportEntities()) {
    //リレーションを定義するためにProjectテーブルの該当データにアタッチする。
    Project pro = new Project() { id = 1 };
    entity.AttachTo("Project", pro);
    //子テーブルにデータを挿入する
    //ここではProject = proでテーブル間のリレーションを定義してやる
    Ship ship = new Ship() { shipName = "はごろも丸", Project = pro };
    entity.AddToShip(ship);
    entity.SaveChanges();
}

データの更新

子テーブルであるShipへのデータ更新について見てみます。

更新対象がわかっているなら、更新対象を特定し、アタッチしたら、更新対象のプロパティを変更します。

using (ImportEntities entity = new ImportEntities()) {
    Ship ship = new Ship() { id = 1 };
    entity.AttachTo("Ship", ship);
    ship.shipName = "任天堂丸";
    entity.SaveChanges();
}

データの削除

子テーブルのデータの削除についても、基本的には子テーブルへのデータ追加と同じでリレーションをとってアタッチしてからとなります。

using (ImportEntities entity = new ImportEntities()) {
    //該当する親テーブルのオブジェクトを作成する。
    Project pro = new Project() { id = 1 };
    //データ輪削除する子テーブルのオブジェクトを作成し、リレーションを設定する
    Ship ship = new Ship() { id = 1, Project = pro };//リレーションの定義をする
    //アタッチする
    entity.AttachTo("Ship", ship);
    //削除する
    entity.DeleteObject(ship);
    entity.SaveChanges();
}

接続文字列

設定ファイル記述等により動的に接続サーバーを変更する必要がある場合には、SqlConnectionStringBuilderクラスと EntityConnectionStringBuilderクラスを使用して接続文字列を生成します。(通常本運用と開発ではSQL Serverが違うし、そんな設定項目にするよね。)

sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.InitialCatalog = dbName;
sqlBuilder.DataSource = serverName;
sqlBuilder.IntegratedSecurity = true;

entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString;
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.Metadata = "res://*/ModelOfLogDatabase.csdl|res://*/ModelOfLogDatabase.ssdl|res://*/ModelOfLogDatabase.msl";

MetaDataはEDMのデザイナーが生成する接続文字列から持ってきます。

image

この接続文字列を使ってエンティティコンテナがデータベースサーバにアクセするようにするには、エンティティコンテナのコンストラクタの引数にこの接続文字列を指定します。

var context = new ImportEntities(entityBuilder.ConnectionString)

コメントを残す