我应该如何与EF代码第一种模式的用户之间的友谊?(How should I model friend

2019-07-05 10:31发布

我特林找出如何表现与实体框架(5)的代码,首先用户之间的友谊。 我最初的想法是创建一个类友谊它包含两个用户实例的引用,这样的友谊是由单独的对象表示。

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.

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

Answer 1:

我设法后一些使用Google找到的SO类似的问题,并有一个解决方案有至少使它成为数据库没有问题。

基本上,我加入每用户外键的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);
}


Answer 2:

你可以自己定义外键或删除级联删除,这取决于您的方案。 请参阅此相关的问题: 实体框架的Code First:外键约束可能会导致循环或多个级联路径



文章来源: How should I model friendships between users with EF code first?