4

我想弄清楚如何使用 Entity Framework (5) Code First 来表示用户之间的友谊。我最初的想法是创建一个类 Friendship,其中包含对两个 User 实例的引用,以便友谊由单独的对象表示。

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 Migrations 创建数据库时,由于 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.

关于如何解决这个问题的建议将非常受欢迎。

4

2 回答 2

5

经过一番谷歌搜索后,我设法在 SO 上找到了一个类似的问题,并且那里有一个解决方案,至少可以毫无问题地将其放入数据库中。

基本上,我将每个用户的外键添加到Friendship类中,使它们成为复合主键,并将第二个外键配置为在删除时不级联。我最终使用了 EF fluent 配置。

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);
}
于 2012-12-15T22:41:59.580 回答
0

您可以自己定义外键或删除级联删除,具体取决于您的方案。请参阅此相关问题:Entity Framework Code First: FOREIGN KEY constraint may cause cycles or multiple cascade paths

于 2012-12-15T22:15:35.797 回答