かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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();