【问题标题】:How to change foreign key name in EF Core Fluent API? [duplicate]如何更改 EF Core Fluent API 中的外键名称? [复制]
【发布时间】:2021-09-06 00:28:45
【问题描述】:

我正在尝试使用 EF Core fluent API 在两个类之间建立多对多关系。如何更改将为此关系创建的表的外键名称?

例如,如果我们在以下两个类之间创建多对多关系:

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

// Fluent Api
public class UserMap : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.HasKey(x => x.Id);
        builder.ToTable("Users");

        builder.HasMany<Course>(user => user.Courses)
               .WithMany(course => course.Users);
    }
}

一个表是这样创建的:

我想要的是使用我在代码优先期间提供的外键名称创建中间表。

我知道我可以将中间表编写为一个类并通过一对多关系更改名称,但我想使用代码优先。

示例取自 EF 核心 documentation

【问题讨论】:

  • 我相信你可以在 .WithMany() 之后添加 .HasForeignKey("ForeignKeyName")。将“ForeignKeyName”替换为您想要的名称。见docs.microsoft.com/en-us/ef/core/modeling/…影子外键
  • 不,我不能,即使我可以,那里有两个外键,我可以用 HasForeignkey 函数重命名哪一个。

标签: c# entity-framework-core many-to-many ef-fluent-api


【解决方案1】:

您可能想为中间表添加一个新类:

public class StudentCourse
{
    public int FKStudentId { get; set; }
    public int FKCourseId { get; set; }

    public virtual Student Student { get; set; }
    public virtual Course Course { get; set; }

}

并替换导航属性:

public virtual ICollection<Course> Courses { get; set; }

public virtual ICollection<StudentCourse> Courses { get; set; }

Course 类中做同样的事情。

然后在fluent Api中,你现在可以使用新的类了。

public class StudentConfiguration : IEntityTypeConfiguration<Student>
{
    public void Configure(EntityTypeBuilder<Student> entity)
    {
        entity.HasKey(x => x.StudentId);

        entity.HasMany(student => student.Courses)
            .WithOne(course => course.Student)
            .HasForeignKey(x => x.FKStudentId);

    }
}

public class CourseConfiguration : IEntityTypeConfiguration<Course>
{
    public void Configure(EntityTypeBuilder<Course> entity)
    {
        entity.HasKey(x => x.CourseId);

        entity.HasMany(course => course.Students)
            .WithOne(stud => stud.Course)
            .HasForeignKey(x => x.FKCourseId);

    }
}

编辑:如果你不想添加中间类,你可能想试试这个:

        entity.HasMany(student => student.Courses)
            .WithMany(course => course.Students)
            .UsingEntity(x => x.Property("StudentsStudentId").HasColumnName("FKStudentId"));

        entity.HasMany(course => course.Students)
            .WithMany(stud => stud.Courses)
            .UsingEntity(x => x.Property("CoursesCourseId").HasColumnName("FKCourseId"));

注意:"StudentsStudentId""CoursesCourseId" 是通过命名约定生成的。因此,您可能希望先添加迁移而不使用 .UsingEntity(),然后检查生成的迁移。

【讨论】:

  • 感谢您的回答,但我想创建没有类来表示它的中间表。我在代码方面不需要这个类。
  • @AliYıldızöz 编辑了我的答案,以便在不需要课间的情况下迎合。
  • 是的,它成功了,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多