c# - EF代码第一个外键组合失败

标签 c# entity-framework ef-code-first

我有一个通过以下类进行代码优先迁移的项目:

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);
        }


但没有结果,我仍然得到错误。谁能在这件事上大放光彩?

最佳答案

尝试

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);
}

答案来自帖子

关于c# - EF代码第一个外键组合失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18228956/

相关文章:

c# - 如果我有继承类类型的 MethodInfo,如何获取接口(interface)的 MethodInfo?

c# - 使用 WFA 接口(interface)插入数据时发生 sqlException

asp.net-mvc - 在 Azure 上找不到“Microsoft.SqlServer.Types”版本 10 或更高版本

entity-framework - Entity Framework 6.1 将我的数据库放在哪里?

c# - 数据库初始化运行太晚

c# - 在删除属性之前,必须删除或重新定义所有包含的外键 - EF Core

java - Java-在类中添加支持以允许乘法

c# - 如何将 sbyte[] 转换为 base64 字符串?

c# - 使用主表中的重命名字段和非主键创建实体关系

java - JPA持久性:从列表中自动删除不存在的引用实体