2013-11-25 21 views
1

我想創建一個簡單的好友列表,每行有兩個ID的(用戶ID和朋友id),都引用「ID」,在相應的用戶配置文件字段在EF中的朋友列表最簡單的方法是什麼?

| relationId |用戶id | friendId |

讓用戶成爲朋友,如果雙方都向友人發送友誼請求。例如:
| 1 | 2 | 4 |
| 1 | 4 | 2 | // ID爲2和4的用戶是朋友

到目前爲止,設置外鍵對我來說很簡單。當我必須將兩個外鍵設置到同一個表時,事情會變得更加困難。我得到了不同的錯誤,我期望解決這個問題,然後重新調整我的代碼,最後我覺得我太過於複雜了。

用戶配置模式:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string Email { get; set; } 
} 

朋友型號:

[Table("Friends")] 
public class Friends 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int RelationId { get; set; } 

    public int UserId { get; set; } 

    [ForeignKey("UserId")] 
    public UserProfile User { get; set; } // works with one foreign key 

    public int FriendId { get; set; } 

    [ForeignKey("FriendId")] 
    public UserProfile Friend { get; set; } // doesn't work when I add this one 
} 

這使我有以下異常:

介紹上表中 '朋友' 可能FOREIGN KEY約束 'Friends_User'導致週期或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

我已經搜索了類似的問題,我看到了很多外鍵的例子,但是,我無法找到任何兩個字段鏈接到同一個表的示例。

回答

3

在這種情況下,異常消息告訴您有多個帶有級聯操作的外鍵。這是因爲通過所需的關聯,EF在默認情況下實現級聯刪除。

所以你必須從關聯中刪除至少一個級聯動作。沒有爲這個沒有數據註解,所以你應該使用流利的映射,比如:

modelBuilder.Entity<Friends>() 
      .HasRequired(p => p.User) 
      .WithMany() 
      .HasForeignKey(p => p.UserId) 
      .WillCascadeOnDelete(true); 
modelBuilder.Entity<Friends>() 
      .HasRequired(p => p.Friend) 
      .WithMany() 
      .HasForeignKey(p => p.FriendId) 
      .WillCascadeOnDelete(false); 

(在DbContext的覆蓋OnModelCreating)。

當您使用此映射時,您不再需要ForeignKey屬性。

+0

這正是我一直在尋找的。猜猜這不能簡單地與EF ..我提到它的作品像一個魅力? –

相關問題