0

私はこれらの2つのエンティティを持っています:

public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public bool? IsActive { get; set; }
        public bool? IsAdmin { get; set; }
        public bool? DeletedFlag { get; set; }
        public DateTime LastLoginDate { get; set; }
        public DateTime CreatedDate { get; set; }

        public virtual ICollection<Vote> VoterUser { get; set; }
        public virtual ICollection<Vote> VotedUser { get; set; }


    }

public class Vote
    {
        public int Id { get; set; }
        public DateTime VoteDate { get; set; }
        public int Rate { get; set; }
        public int UserId { get; set; }
        public int VoterId { get; set; }

        public User VotedUser { get; set; }
        public User VoterUser { get; set; }
    }

流れるような API では、次のような外部キーが定義されています。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            modelBuilder.Entity<User>().HasKey(x => x.Id).Property(x => x.Id).IsRequired();
            modelBuilder.Entity<User>().HasMany(x => x.VotedUser).WithRequired(q => q.VotedUser).HasForeignKey(
                q => new {q.UserId});
            modelBuilder.Entity<User>().HasMany(x => x.VoterUser).WithRequired(q => q.VoterUser).HasForeignKey(
                q => new {q.VoterId});

            modelBuilder.Entity<Vote>().HasKey(x => x.Id).Property(x => x.Id).IsRequired();
            modelBuilder.Entity<Vote>().HasRequired(x => x.VotedUser).WithMany().HasForeignKey(p => p.UserId);
            modelBuilder.Entity<Vote>().HasRequired(x => x.VoterUser).WithMany().HasForeignKey(p => p.VoterId);

            base.OnModelCreating(modelBuilder);
        }

しかし、私が得たデータベースを作成しようとすると;

「テーブル 'Votes' に FOREIGN KEY 制約 'FK_Votes_Users_UserId' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更してください。制約を作成できませんでした。前のエラーを参照してください。」

どこで間違えますか?

ありがとう

4

1 に答える 1

0

WillCascadeOnDelete(false)を Vote 外部キーに追加する必要があります。つまり、次のようになります。

        modelBuilder.Entity<Vote>().HasRequired(x => x.VotedUser).WithMany().HasForeignKey(p => p.UserId)
                    .WillCascadeOnDelete(false);
        modelBuilder.Entity<Vote>().HasRequired(x => x.VoterUser).WithMany().HasForeignKey(p => p.VoterId)
                    .WillCascadeOnDelete(false);

エラーメッセージには、何が起こったのかがすでに説明されています。Vote と User の間に HasMany および HasRequired 関係を追加することにより、User から Vote へ、およびその逆への複数の FK を作成します。

1 つのテーブルで行を削除すると、もう一方のテーブルでカスケード削除が発生し、再び元に戻ります。これにより競合状態が発生する可能性があるため、SQL Server はランナウェイ変更を引き起こすよりもトランザクションをブロックすることを好みます。ON DELETE NO ACTION 句を使用して、リレーションの 1 つがカスケード変更を発生させないように指定することで、これを回避できます。

あなたの場合、プライマリ エンティティは常にユーザーであると思われます。その場合、Vote->User 関係は NO ACTION 句でマークする必要があります。

Fluent API でこれを行うには、 WillCascadeOnDelete(false)拡張メソッドを使用する必要があります。

于 2012-06-20T12:58:15.110 に答える