如何使用EF代码优先模型化用户之间的友谊关系?

4

我正在尝试使用Entity Framework(5)Code First来表示用户之间的友谊关系。我的初始想法是创建一个包含对两个用户实例的引用的Friendship类,以便通过单独的对象表示友谊关系。

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.

欢迎提出解决此问题的建议。

2个回答

5

在进行了更多的谷歌搜索后,我找到了一个类似的SO问题,并且那里提供了一种解决方案,可以将其无误地添加到数据库中。

基本上,我在友谊类中为每个用户添加了外键,将它们设置为组合主键,并配置第二个外键在删除时不进行级联。最终,我使用了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);
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接