2011-11-30 5 views
10

私は、Entity Framework Code Firstを使用してかなり大きなデータベーススキーマを開発しています。ドメインオブジェクトを単純なPOCOとして残すため、データアノテーションのアプローチよりもFluent APIが好まれます。エンティティフレームワークのコードでは、まず別々のファイルで流暢なマッピングが可能ですか?

Fluent APIを使用するには、DbContextから継承するクラスでOnModelCreatingをオーバーライドする必要があります。

すべてのエンティティのすべてのマッピングがこの1つの方法にあるとは思いません。私は以前FluentNHibernateのようなものを使っていましたが、各エンティティには独自のマッピングクラスがあります。 EFには何か類似点はありますか?

マッピングクラスを実装するための独自のインターフェイスを作成し、それらをすべてOnModelCreatingメソッド内で呼び出すことができます。私は反射やIoCを使ってそれらをすべて発見することができました。特に私はこのアプローチに間違ったことは何も見ていませんが、Entity Frameworkに既にこのようなものが入っているのかどうか疑問に思っていましたか?

答えて

27

EntityTypeConfiguration<TEntity>から派生したエンティティごとに1つの構成クラスを作成し、これらのクラスを別々のファイルに入れることができます。派生したDbContextでは、それらの構成クラスのインスタンスをモデルビルダーに追加します。例:

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     HasKey(u => u.UserName); 

     Property(u => u.UserName) 
      .HasMaxLength(50) 
      .IsRequired(); 

     // etc. 
    } 
} 

public class RoleConfiguration : EntityTypeConfiguration<Role> 
{ 
    public RoleConfiguration() 
    { 
     HasKey(r => r.RoleName); 

     // etc. 
    } 
} 

派生コンテキスト:

public class MyContext : DbContext 
{ 
    //... 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new UserConfiguration()); 
     modelBuilder.Configurations.Add(new RoleConfiguration()); 
    } 
} 

あなたは複雑なタイプを設定するから派生することができますComplexTypeConfiguration<T>もあります。

+3

「複合型コンフィグレーション」の記述には+1 – vossad01

+0

一般に、このアプローチは良い方法と考えられますか? –

+1

大規模な複雑なモデルを扱う場合は、ほとんど必要です。それ以外の場合は、すべてを1つのOnModelCreatingメソッドに入れる必要があります。 – Tony

関連する問題