2012-03-27 110 views
4

我需要使用實體框架代碼優先映射多對多關係。它是一個標準的社交網絡FriendRequests映射。用戶對象具有類型爲List<User>的FriendRequests的集合。在數據庫中我使用的連接表的關係如下:實體框架代碼第一個集合映射 - 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 

如何映射在實體框架代碼首先,用戶對象,以使通過連接表的集合?

回答

2

你可以試試這樣說:

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; } 
} 

映射用流利的API:

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

因爲在鏈路表中RequestDate屬性不能映射這是一個許多一對多關係。相反,您需要兩個如上所示的一對多關係。

可能你需要禁用級聯刪除,我不確定。您可以通過在兩個一對多映射的末尾附加.WillCascadeOnDelete(false)來完成此操作。

編輯

您的意見:如果刪除RequestDate列您可以創建一個多一對多的關係模型。你不需要在這種情況下FriendRequest實體:

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

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

映射用流利的API:

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

的RequestDate屬性不是必需的。如果我刪除該列,是否有辦法將其作爲多對多來執行? – reach4thelasers 2012-03-27 15:35:28

+0

@ reach4thelasers:是的,看我的編輯。 – Slauma 2012-03-27 15:42:23

+0

感謝您的迴應。我嘗試了你的代碼,並將一些示例數據放入連接表中來測試它,但我總是爲user.FriendRequests.Count()獲取0。我需要做些什麼才能獲取Joined集合? – reach4thelasers 2012-03-27 16:05:32