2012-02-14 11 views
1

モデルの複数のエンティティによって共有されるオブジェクトにナビゲーションプロパティを配置する必要はありません。ここで私が何を言っているかの例です:Entity Framework 4.1の多対多関係をナビゲートする方法についての考え方

public abstract class SomeEntity 
    { 
     public Guid Id {get;set;   
     public virtual ICollection<Attachment> Attachements {get;set;} 
    } 

    public class User: SomeEntity 
    { 
     ... 
    } 

    public class Thing: SomeEntity 
    { 
     ... 
    } 

    public class Attachment 
    { 
     public Guid Id {get;set;}   
     ... 
    } 

私はユーザーと物事のための結合エンティティのナビゲーションプロパティを持つ避けるために疲れています。その背後にある私の考えは、Lazy Loadingを使用している状況を避けることです。

AttachemntにはICollection<SomeEntity> Entitesがあると考えられましたが、それは以前のマッピングの問題を抱えているため、動作するかどうかはわかりません。私が持っていた別の考えは、Attachmentsからエンティティへ手動でナビゲートすることでしたが、それはオブジェクトのコレクションを戻して型を調べるメソッドを書く必要があることを意味します。

私はEFはこのようなリンクテーブルを生成するが午前:

HasMany(e => e.Attachments).WithMany().Map(m => { m.MapLeftKey("AttachmentId"); 
                    m.MapRightKey("UserId"); 
                    m.ToTable("User_Attachments"); 
      }); 

は私の添付ファイルテーブルを見ると、バックリンクテーブルのいずれかへのFKはありません。私はそれらに戻ってナビゲートしていないので、意味があります。

+0

質問は何ですか? –

+0

@LadislavMrnka、Attachmentエンティティでナビゲーションプロパティを使用しないと、別のエンティティに戻る方法はありません。 – DDiVita

+0

したがって、ナビゲーションのプロパティを必要とするかどうかを指定します。戻るに移動する場合は、 'SomeEntity'コレクションのナビゲーションプロパティを作成してください。 –

答えて

1

遅延読み込みが心配な場合は、ナビゲーションプロパティを仮想ではなく、レイジー読み込みを実行しないようにすることができます。

また、ナビゲーションプロパティをプライベートにして、制御された方法でコンテンツにアクセスすることもできます。ナビゲーションプロパティを非公開にすると、Code First APIを使用してプライベートプロパティをマッピングするためのトリックの1つを使用する必要があります。簡単にするために、私は、エンティティ内EntityConfigurationを埋め込むものを使用しています:

public class Attachment 
{ 
    public Guid Id { get; set; } 

    private ICollection<User> Users { get; set; } 

    public class AttachmentConfiguration : EntityTypeConfiguration<Attachment> 
    { 
     public AttachmentConfiguration() 
     { 
      HasMany(e => e.Users) 
       .WithMany(e => e.Attachements) 
       .Map(m => 
        { 
         m.MapLeftKey("UserId"); 
         m.MapRightKey("AttachmentId"); 
         m.ToTable("User_Attachments"); 
        }); 
     } 
    } 
} 

はOnModelCreatingの内側にこの設定を追加します。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new Attachment.AttachmentConfiguration()); 
} 

あなたは、あなたがしたいか、どのような方法で内部の添付ファイルからのユーザーにアクセスすることができます

また、DbContextチェンジトラッカーAPIを使用して、コンテキストを持つ場所からアクセスすることもできます。たとえば:あなたは本当にまったくナビゲーションプロパティを希望しない場合は

var users = context.Entry(attachment).Collection<User>("Users").CurrentValue; 

、あなたはObjectContextにまで低下し、EntityCollectionになるコレクションのためのRelatedEndを得ることができます。これは、EDMXをダンプすることによって見つけることができるアソシエーションとエンドネームの概念モデル名を知る必要があるなど、いくつかの理由からかなり難しいコードです。私は可能な限り、このアプローチを避けるだろう。

+0

マッピングの設定はまさに私が使っているものです。これについての素晴らしい考え! – DDiVita

+0

私の主な関心事は、怠惰な読み込みと仮想キーワードを見過ごしていた。それを使用してその使用を忘れるのは習慣になります;) – DDiVita

関連する問題