2

我有一个带有以下类的 codefirst 迁移项目:

public class User
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public virtual ICollection<Chat> Chats { get; set; }
    }

public class Chat

{
    [Key, Column(Order = 0)]
    public int User1Id { get; set; }

    public virtual User User1 { get; set; }

    [Key, Column(Order = 1)]
    public int User2Id { get; set; }

    public virtual User User2 { get; set; }

    public string Channel { get; set; }
}

想法是一个聊天有两个用户,聊天主键是两个用户ID的组合键,是外键。

用户还具有他参与的聊天列表。

现在,当我尝试运行它时,出现以下错误:

Introducing FOREIGN KEY constraint 'FK_dbo.Chat_dbo.User_User2Id' on table 'Chat' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我有点明白发生了什么,但我不知道如何解决它。试过这个(来自某个地方的主题):

public DbSet<User> Users { get; set; }
        public DbSet<Chat> Chats { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            modelBuilder.Entity<Chat>()
                .HasRequired(s => s.User1)
                .WithMany()
                .WillCascadeOnDelete(true);

            modelBuilder.Entity<Chat>()
                .HasRequired(s => s.User2)
                .WithMany()
                .WillCascadeOnDelete(true);

            base.OnModelCreating(modelBuilder);
        }

但没有结果,我仍然得到错误。任何人都可以对这件事有所了解吗?

4

1 回答 1

1

尝试

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Chat> InitiatedChats { get; set; }
    public virtual ICollection<Chat> ParticipantInChats { get; set; }
}
public class Chat
{
    [Key, Column(Order = 0)]
    public int User1Id { get; set; }

    public virtual User User1 { get; set; }

    [Key, Column(Order = 1)]
    public int User2Id { get; set; }

    public virtual User User2 { get; set; }

    public string Channel { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Chat>()
        .HasRequired(s => s.User1)
        .WithMany(u => u.InitiatedChats)
        .HasForeignKey(s => s.User1Id)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Chat>()
        .HasRequired(s => s.User2)
        .WithMany(u => u.ParticipantInChats)
        .HasForeignKey(s => s.User2Id)
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}

答案来自这篇文章

于 2013-08-14T16:06:17.387 回答