4

Entity Framework (5) Code First を使用してユーザー間の友情を表現する方法を理解しようとしています。私の最初のアイデアは、2 つの User インスタンスへの参照を含むクラス 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 移行を介してデータベースを作成しようとすると、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クラスに追加し、それらを複合主キーにして、削除時にカスケードしないように 2 番目の外部キーを構成しました。最終的に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);
}
于 2012-12-15T22:41:59.580 に答える
0

シナリオに応じて、外部キーを自分で定義することも、カスケード削除を削除することもできます。この関連する質問を参照してください:Entity Framework Code First:FOREIGN KEY制約により、サイクルまたは複数のカスケードパスが発生する可能性があります

于 2012-12-15T22:15:35.797 に答える