我应该如何首先使用EF代码在用户之间建立友谊?

时间:2012-12-15 21:44:17

标签: entity-framework ef-code-first entity-framework-5 ef-migrations

我想弄清楚如何用Entity Framework(5)Code First来表示用户之间的友谊。我最初的想法是创建一个友谊类,其中包含对两个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迁移创建数据库时,由于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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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