首页 文章

实体框架核心流畅的api一对多和一对一生成重复的外键

提问于
浏览
0

我正在使用Entity Framework Core和Fluent API将我的ASP.NET MVC项目更改为ASP.NET Core MVC . 当我尝试配置一对一和一对多关系时,它会在从属表中生成重复的外键列 .

例如:我在我的上下文的 OnModelCreating 方法中有这个:

builder.Entity<Session>()
       .HasKey(s=>s.Id);
builder.Entity<Session>()
       .Property(s=>s.CourseId)
       .IsRequired();
builder.Entity<Session>()
       .HasOne<Course>()
       .WithMany(c => c.Sessions)
       .HasForeignKey(s=>s.CourseId)
       .IsRequired();

会话模型是这样的:

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

    // foreign key 
    public int CourseId { get; set; }

    // navigation properties
    public virtual Course Course { get; set; }
}

课程模型是这样的:

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

    // Navigation properties
    public ICollection<Session> Sessions { get; set; }
}

而不是在迁移中重新获得:

modelBuilder.Entity("Blackboard.Models.DomainModels.Session", b =>
    {
        b.Property<int>("Id")
            .ValueGeneratedOnAdd();

        b.Property<int>("CourseId");

        b.HasKey("Id");

        b.HasIndex("CourseId");

        b.ToTable("Sessions");
   });

我明白了:

modelBuilder.Entity("Blackboard.Models.DomainModels.Session", b =>
    {
        b.Property<int>("Id")
            .ValueGeneratedOnAdd();

        b.Property<int>("CourseId");

        b.Property<int?>("CourseId1");

        b.HasKey("Id");

        b.HasIndex("CourseId");

        b.HasIndex("CourseId1");

        b.ToTable("Sessions");
   });

所以即使我把 .IsRequired(); 用于关系,这个关系似乎是可选的,并且可选的 CourseId1 被添加到表中 .

该应用程序是在Mac OSX上使用Visual Studio for Mac开发的 .

我已经配置了这么久,我只找到了Entity Framework而不是Entity Framework Core的东西 . 他们两个没有配置相同的方式 . 有谁可以帮助我吗?

谢谢 .

1 回答

  • 0

    我发现了一个问题 . 我把背景归为:

    builder.Entity<Session>()
       .HasOne(s=>s.Course)
       .WithMany(c => c.Sessions)
       .HasForeignKey(s=>s.CourseId)
       .IsRequired();
    

    我记得我看到某个地方说如果只有一个导航属性,那么可以使用 .HasOne<Type>() (没有参数传递) . 显然,它不起作用 . 所以总是在 .HasOne 中使用lambda参数 .

相关问题