O/R インピーダンスミスマッチ LINQ to SQL
[雑記] O/R インピーダンスミスマッチ(LINQ to SQL の概念説明) (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp3_ormismatch.html
概要、O/Rインピーダンスミスマッチ、OOPのクラスとRDBのテーブル、OOPの階層的データ構造とRDBのテーブル結合、LINQ to SQL
インピーダンスミスマッチとは、コンセプトの異なる2つの分野を繋ぐときの困難さ。
O/RはObject/Relationalのことで、OOPとRDBのこと。
OOPのクラスとRDBのテーブルには大きな差は生まれない。
問題は、複数のテーブルの関係性を表す時に生じる。RDBでは階層性がない代わりに、テーブル結合を使ってデータを取り出す。
どうやってLINQ to SQLではミスマッチを解決してるかの概要
Entity, DataContext, IQueryableとクエリ式、Association
Entity
まずRDBのテーブルにあたるクラスをつくる。これをEntity(実体)クラスという。
Entityクラスには、Table属性を、メンバー(テーブルの列にあたる)にはColumn属性をつける。
using System.Data.Linq.Mapping; [Table(Name = "Authors")] public class Author { [Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)] public int Id; [Column] public string Name; [Column] public DateTime? Birthday; [Column] public string Url; }
EntityクラスはIQueryableを実装している。
DataContext
RDBのサーバに接続するためのクラスをつくる。DataContextクラスという。
using System.Data.Linq; public class ComicDataContext : DataContext { public ComicDataContext(string connectionString) : base(connectionString) { } public Table<Author> Author; public Table<Series> Series; }
Association 2つのテーブルの関連性の記述
具体的には、Entityクラスのメンバーとして、Association属性のついたものを定義する。