Entity Framework Core свободно использует API One-To-Many и One-To-One создает дублированный внешний ключ
Я изменяю свой проект ASP.NET MVC на ASP.NET Core MVC с Entity Framework Core и Fluent API. Когда я пытаюсь настроить отношение один-к-одному и один-ко-многим, он генерирует дубликаты столбцов внешнего ключа в зависимой таблице.
Например: у меня есть это в моем контексте 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 для Mac.
Я настраивал это так долго, я нашел что-то только для Entity Framework вместо Entity Framework Core. Они два не настроены одинаково. Может кто-то помочь мне, пожалуйста?
Спасибо.
1 ответ
Я нашел исправление. Я изменил контекст, чтобы:
builder.Entity<Session>()
.HasOne(s=>s.Course)
.WithMany(c => c.Sessions)
.HasForeignKey(s=>s.CourseId)
.IsRequired();
Я помню, где-то говорил, что если есть только одно свойство навигации, то .HasOne<Type>()
(параметры не переданы) могут быть использованы. Очевидно, это не работает. Поэтому всегда используйте лямбда-параметр в .HasOne
,