2012-03-27 7 views
4

Entity Framework Code Firstを使用して多対多リレーションシップをマップする必要があります。その標準的なソーシャルネットワーキングFriendRequestsマッピング。ユーザーオブジェクトには、List<User>のFriendRequestsのコレクションがあります。次のようにデータベースでは、私は関係のために結合テーブルを使用しています:Entity Frameworkコードファーストコレクションマッピング - FriendRequests

CREATE TABLE dbo.FriendRequests(
    UserId INT NOT NULL FOREIGN KEY REFERENCES dbo.Users(id), 
    FriendId INT NOT NULL FOREIGN KEY REFERENCES dbo.Users(id), 
    RequestDate SMALLDATETIME NOT NULL DEFAULT GETUTCDATE()) 
GO 
ALTER TABLE dbo.FriendRequests ADD PRIMARY KEY (UserId,FriendId) 
GO 

にはどうすれば参加するテーブルを経由してコレクションを有効にするには、Entity Frameworkのコードファーストでユーザオブジェクトをマッピングしていますか?

答えて

2

あなたはこの方法でそれを試すことができますので、あなたは多対多としてこれをマッピングすることはできません、リンクテーブル内のRequestDateプロパティの

modelBuilder.Entity<User>() 
    .HasMany(u => u.FriendRequests) 
    .WithRequired(f => f.User) 
    .HasForeignKey(f => f.UserId); 

modelBuilder.Entity<FriendRequest>() 
    .HasKey(f => new { f.UserId, f.FriendId }); 

modelBuilder.Entity<FriendRequest>() 
    .HasRequired(f => f.Friend) 
    .WithMany() 
    .HasForeignKey(f => f.FriendId); 

:流暢APIと

public class User 
{ 
    public int Id { get; set; } 

    public ICollection<FriendRequest> FriendRequests { get; set; } 
} 

public class FriendRequest 
{ 
    public int UserId { get; set; } 
    public int FriendId { get; set; } 

    public DateTime RequestDate { get; set; } 

    public User User { get; set; } 
    public User Friend { get; set; } 
} 

がマッピング関係。代わりに、上記のように2対1の関係が必要です。

おそらく、カスケード削除を無効にする必要があります。わかりません。これを行うには、2つの一対多マッピングの最後に.WillCascadeOnDelete(false)を追加します。あなたのコメントに

編集

:あなたはRequestDate列を削除する場合は、多対多の関係を使用してモデルを作成することができます。流暢APIと

public class User 
{ 
    public int Id { get; set; } 

    public ICollection<User> FriendRequests { get; set; } 
} 

がマッピング:

modelBuilder.Entity<User>() 
    .HasMany(u => u.FriendRequests) 
    .WithMany() 
    .Map(m => 
    { 
     m.ToTable("FriendRequests"); 
     m.MapLeftKey("UserId"); 
     m.MapRightKey("FriendId"); 
    }); 
+0

RequestDateプロパティは必須ではありませんあなたはこのケースでFriendRequest実体を必要としません。その列を削除すると、多対多として行う方法はありますか? – reach4thelasers

+0

@ reach4thelasers:はい、私の編集を参照してください。 – Slauma

+0

お返事ありがとうございます。私はあなたのコードを試し、それをテストするためにいくつかのサンプルデータを結合テーブルに入れましたが、私はuser.FriendRequests.Count()に対して常に0を得ています。結合されたコレクションを取得するために必要なことはありますか? – reach4thelasers