かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

UWPでEntityFramework 2種類のコードファーストでのモデル定義方法

Entity Frameworkには、アノテーションでクラスに属性をつけてDBの定義を行う方法と、ContextクラスのOnModelCreatingメソッドでModelBuilderクラスを使ったFluentAPIの2種類の定義方法があります。 なんとなく、流れを見てる感じだとModelBuilderを使った定義方法が主流になっているように見えるのと、Entity Frameworkが提供している全機能にアクセスできるのはModelBuilderを使った機能のみっぽいです。

なので、ここでもModelBuilderを使った定義方法をちょっと見ていこうと思います。

エンテティの取得

まず、テーブルに関する情報を設定するためにModelBuilderのEntityメソッドを使ってエンテティに関する定義(テーブル単位の定義とみておk)をするクラスを取得します。これに対して色々な設定をしていきます。

// 例えばAddressクラスの定義をしようとする場合
var address = modelBuilder.Entity<Address>();

テーブル名の設定

テーブル名の設定はEntityで取得したクラスに対して、ToTableメソッドを呼び出すことで設定可能です。引数にテーブル名を渡します。2つ引数を渡すバージョンではスキーマ名を指定することもできます。

address.ToTable("Addresses");

列に関する設定

列に対して、最大長を設定したり、必須入力項目に設定することが出来ます。列の設定はPropertyメソッドで列を指定してから、設定を行います。HasMaxLengthで長さを指定して、IsRequiredで必須入力を設定できます。

var address = modelBuilder.Entity<Address>();
address.Property(x => x.City)
    .HasMaxLength(512)
    .IsRequired();

デフォルト値の設定もできますが、SQLiteではサポートされてないみたいでエラーになりました。

modelBuilder.Entity<Person>()
    .ToTable("People")
    .Property(x => x.Name)
    // 人類のデフォルト名は田中だ
    .HasDefaultValue("田中")
    .IsRequired();