4

我想弄清楚如何使用實體框架代表用戶之間的友誼(5)代碼優先。我最初的想法是創建一個包含對兩個User實例的引用的類Friendship,以便友誼由不同的對象表示。我應該如何建立EF用戶之間的友誼模型?

public class Friendship 
{ 
    public virtual int Id { get; set; } 
    [Required] 
    public virtual UserProfile User1 { get; set; } 
    [Required] 
    public virtual UserProfile User2 { get; set; } 
    [Required] 
    public virtual DateTime Since { get; set; } 
} 

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

當試圖通過創建EF遷移數據庫,但是,我很爲難由於SQL錯誤:

Introducing FOREIGN KEY constraint 'FK_dbo.Friendships_dbo.UserProfile_User2_UserId' on table 'Friendships' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

建議如何解決這個問題將是非常歡迎的。

回答

5

我設法找到一個類似的問題後,在一些更多的谷歌搜索,有一個解決方案,至少沒有問題的數據庫。

基本上,我將每個用戶的外鍵添加到Friendship類中,使它們成爲一個組合主鍵,並將第二個外鍵配置爲不在級聯上進行刪除。我結束了使用EF流利配置。

public class Friendship 
{ 
    public virtual int UserId1 { get; set; } 
    public virtual int UserId2 { get; set; } 
    public virtual User User1 { get; set; } 
    public virtual User User2 { get; set; } 
    public DateTime since; 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    ... 
    modelBuilder.Entity<Friendship>().HasKey(f => new { f.UserId1, f.UserId2 }); 
    modelBuilder.Entity<Friendship>() 
     .HasRequired(f => f.User1) 
     .WithMany() 
     .HasForeignKey(f => f.UserId1); 
    modelBuilder.Entity<Friendship>() 
     .HasRequired(f => f.User2) 
     .WithMany() 
     .HasForeignKey(f => f.UserId2) 
     .WillCascadeOnDelete(false); 
} 
相關問題