0

我有这两个实体:

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,反之亦然。

如果您删除一个表中的一行,这将导致另一个表上的级联删除并再次返回。这可能会导致竞争条件,因此 SQL Server 更喜欢阻止事务而不是导致失控的更改。您可以通过使用 ON DELETE NO ACTION 子句指定其中一个关系不会导致级联更改来避免这种情况。

在您的情况下,我怀疑主要实体始终是用户,在这种情况下,投票->用户关系应该用 NO ACTION 子句标记。

要使用 Fluent API 执行此操作,您需要使用WillCascadeOnDelete(false)扩展方法。

于 2012-06-20T12:58:15.110 回答