首页 > 解决方案 > 实体框架核心中的模型循环

问题描述

想象一下这些模型是社交网络应用程序的一部分。User可以创建一个Group并且可以在其中添加其他用户(作为成员),并且用户可以是该组的成员。我正在使用 .net 核心和实体框架核心。

楷模:

public class User : BaseEntity
{
    public string UserName { get; set; }

    public IList<Group> OwnGroups { get; set; }
    public IList<GroupMember> MemberInGroups { get; set; }
}

public class Group : BaseEntity
{
    public string Name { get; set; }
    public int OwnerUserId { get; set; }

    [ForeignKey("OwnerUserId")]
    public User OwnerUser { get; set; }

    public IList<GroupMember> Members { get; set; }
}

public class GroupMember : BaseEntity
{
    public int GroupId { get; set; }
    public int UserId { get; set; }

    [ForeignKey("UserId")]
    public User User { get; set; }

    [ForeignKey("UserId")]
    public Group Group { get; set; }
}

流畅的 API:

    modelBuilder.Entity<User>()
    .HasMany(x => x.OwnGroups)
    .WithOne(x => x.OwnerUser).HasForeignKey(x => x.OwnerUserId).IsRequired().OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity<User>()
    .HasMany(x => x.MemberInGroups)
    .WithOne(x => x.User).HasForeignKey(x => x.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity<Group>()
    .HasMany(x => x.Members)
    .WithOne(x => x.Group).HasForeignKey(x => x.GroupId).IsRequired().OnDelete(DeleteBehavior.Cascade);

当我想迁移到数据库时,会发生这个错误:

在表“GroupMembers”上引入 FOREIGN KEY 约束“FK_GroupMembers_Users_UserId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。

但是,我可以手动制作这个模型,没有问题。 SQL Server 在此处输入图像描述

至少有两种方法可以修复它。但我想知道为什么EF Core说,有一个循环。问题是什么?

标签: c#sql-serverasp.net-coreentity-framework-coreef-fluent-api

解决方案


我认为您的桥接表(连接点)有问题。

尝试这个

public class GroupMember: BaseEntity
{
    public User User { get; set; }

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


    public Group Group { get; set; }

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

推荐阅读