EFCore 数据播种缺失数据插入?

如何解决EFCore 数据播种缺失数据插入?

我有两个相关的类如下:

public class Student
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public long FavoriteCourseId { get; set; }
}

public class Course
{
    public long Id { get; set; }
    public string Name { get; set; }
}

两者之间是一对一的关系。 Student一个外键,它通过 Course 引用 FavoriteCourseId

我的流畅映射如下:

protected override void OnModelCreating(ModelBuilder modelBuilder) {
  modelBuilder.Entity<Student>(entity => {
    entity.ToTable("Student").HasKey(k => k.Id);
    entity.Property(p => p.Id).HasColumnName("StudentID");
    entity.Property(p => p.Name).Isrequired();
    entity.Property(p => p.Email).Isrequired();
    entity.Property(p => p.FavoriteCourseId).Isrequired();
  });

  modelBuilder.Entity<Course>(entity => {
    entity.ToTable("Course").HasKey(k => k.Id);
    entity.Property(p => p.Id).HasColumnName("CourseID");
    entity.Property(p => p.Name).Isrequired();
  });

  modelBuilder.Entity<Student>()
            .HasOne(typeof(Course))
            .WithOne()
            .HasForeignKey("Student","FavoriteCourseId")
            .HasConstraintName("FK_Student_Course");

  modelBuilder.Entity<Course>().HasData(
            new Course { Id = 1,Name = "Calculus" },new Course { Id = 2,Name = "Chemistry" },new Course { Id = 3,Name = "Literature" },new Course { Id = 4,Name = "Trigonometry" },new Course { Id = 5,Name = "Microeconomics" });

  modelBuilder.Entity<Student>().HasData(
     new Student { Id = 1,Name = "Alice",Email = "alice@gmail.com",FavoriteCourseId = 2 },new Student { Id = 2,Name = "Bob",Email = "bob@outlook.com",FavoriteCourseId = 2 });
}

在这里,我正在播种两个学生 - Alice 和 Bob。但是,当我创建 init 迁移时,迁移的种子只有 Bob,而忽略 Alice。

migrationBuilder.InsertData(
            table: "Student",columns: new[] { "StudentID","Email","FavoriteCourseId","Name" },values: new object[] { 2L,"bob@outlook.com",2L,"Bob" });

为什么 Alice 的数据行被忽略了?我还注意到只有当 Alice 和 Bob 的 FavoriteCourseId 相同时,数据行才会被忽略。如果我将两行的 FavoriteCourseId 更改为不同的值,则会插入 Alice。

解决方法

它只播种一名学生,因为根据您的模型,同一门课程只能有一名学生。把模型改成这样:

public class Student
{
   [Key]
    public long Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public long FavoriteCourseId { get; set; }
    [ForeignKey(nameof(FavoriteCourseId ))]
     [InverseProperty("FavoriteCourses")]
      public virtual Course FavoriteCourse { get; set; }
}

public class Course
{
    [Key]
    public long Id { get; set; }
    public string Name { get; set; }
    [InverseProperty(nameof(Student.FavoriteCourse))]
    public virtual ICollection<Student> Students{ get; set; }
}

和 dbcontext:

modelBuilder.Entity<Student>(entity =>
{
 entity.HasOne(d => d.FavoriteCourse)
 .WithMany(p => p.Courses)
 .HasForeignKey(d => d.FavoriteCourseId)
  .OnDelete(DeleteBehavior.ClientSetNull);
}

modelBuilder.Entity<Course>().HasData(
            new Course { Id = 1,Name = "Calculus" },new Course { Id = 2,Name = "Chemistry" },new Course { Id = 3,Name = "Literature" },new Course { Id = 4,Name = "Trigonometry" },new Course { Id = 5,Name = "Microeconomics" });

  modelBuilder.Entity<Student>().HasData(
     new Student { Id = 1,Name = "Alice",Email = "alice@gmail.com",FavoriteCourseId = 2 },new Student { Id = 2,Name = "Bob",Email = "bob@outlook.com",FavoriteCourseId = 2 });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?