Add-Migration编译成功后停滞,疑因数据映射问题求助
数据映射配置冲突导致Add-Migration停滞
你的迁移停滞问题完全是由OnModelCreating中的错误配置导致的,具体问题如下:
1. 多对多关系配置错误
你尝试用业务实体(Person、TaskItem)作为多对多的连接实体,这会让EF Core混淆实体关系逻辑:
modelBuilder.Entity<TaskItem>().HasMany(c => c.People).WithMany(e => e.TaskItems).UsingEntity<Person>():这里把Person作为TaskItem和Person的连接表,完全不符合逻辑,连接实体应该是独立的中间表(或由EF自动生成),不能复用业务实体。modelBuilder.Entity<Day>().HasMany(e => e.TaskItems).WithMany(e => e.Day).UsingEntity<TaskItem>():同样错误,用TaskItem自身作为Day和TaskItem的连接表,逻辑完全矛盾。
2. 关系定义冲突
你同时给Person和TaskItem定义了两种冲突的关系:
- 先配置多对多:
TaskItem↔Person - 又配置一对多:
Person→TaskItem
这种冲突会让EF Core在解析模型时陷入循环逻辑,直接导致进程停滞。
修正后的配置方案
根据你的业务需求(Day包含任务和人员列表,Person包含任务列表,TaskItem关联单个Person和Day),正确的关系应该是:
Day↔Person:多对多(无双向导航,Person不需要Day引用)Person→TaskItem:一对多Day→TaskItem:一对多
修正后的OnModelCreating代码:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Day与Person的多对多关系,EF自动生成中间表(或指定表名) modelBuilder.Entity<Day>() .HasMany(d => d.People) .WithMany() // 因为Person没有Day的导航属性 .UsingEntity(j => j.ToTable("DayPerson")); // 可选:指定中间表名称 // Person与TaskItem的一对多关系 modelBuilder.Entity<Person>() .HasMany(p => p.TaskItems) .WithOne(t => t.Person) .OnDelete(DeleteBehavior.Cascade); // Day与TaskItem的一对多关系 modelBuilder.Entity<Day>() .HasMany(d => d.TaskItems) .WithOne(t => t.Day) .OnDelete(DeleteBehavior.Cascade); }
配套实体类检查
确保你的实体类导航属性与配置匹配:
- Person类:
public class Person { public int Id { get; set; } // 其他属性 public ICollection<TaskItem> TaskItems { get; set; } = new List<TaskItem>(); // 不需要Days导航属性(符合你的需求) } - Day类:
public class Day { public int Id { get; set; } // 其他属性 public ICollection<TaskItem> TaskItems { get; set; } = new List<TaskItem>(); public ICollection<Person> People { get; set; } = new List<Person>(); } - TaskItem类:
public class TaskItem { public int Id { get; set; } // 其他属性 public Person Person { get; set; } public Day Day { get; set; } }
修正完成后,重新执行Add-Migration即可正常生成迁移文件。
内容的提问来源于stack exchange,提问作者Kcampbell22
相关产品推荐
相关产品推荐

