Entity Framework Core fluent api 一对多和一对一产生重复的外键
Entity Framework Core fluent api One-To-Many and One-To-One produces duplicate foreign key
我正在将我的 ASP.NET MVC 项目更改为 ASP.NET Core MVC with Entity Framework Core and Fluent API。当我尝试配置一对一和一对多关系时,它会在相关 table 中生成重复的外键列。
例如:我在上下文的 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
添加到 table。
该应用程序是在 Mac OSX 上开发的,Visual Studio 用于 Mac。
我已经配置了这么久,我只找到了 Entity Framework 而不是 Entity Framework Core 的东西。他们两个的配置方式不同。有人可以帮我吗?
谢谢。
我找到了修复方法。我将上下文更改为:
builder.Entity<Session>()
.HasOne(s=>s.Course)
.WithMany(c => c.Sessions)
.HasForeignKey(s=>s.CourseId)
.IsRequired();
我记得在某处看到说如果只有一个导航属性,那么.HasOne<Type>()
(不传参数)就可以了。显然,这是行不通的。所以总是在 .HasOne
.
中使用 lambda 参数
我正在将我的 ASP.NET MVC 项目更改为 ASP.NET Core MVC with Entity Framework Core and Fluent API。当我尝试配置一对一和一对多关系时,它会在相关 table 中生成重复的外键列。
例如:我在上下文的 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
添加到 table。
该应用程序是在 Mac OSX 上开发的,Visual Studio 用于 Mac。
我已经配置了这么久,我只找到了 Entity Framework 而不是 Entity Framework Core 的东西。他们两个的配置方式不同。有人可以帮我吗?
谢谢。
我找到了修复方法。我将上下文更改为:
builder.Entity<Session>()
.HasOne(s=>s.Course)
.WithMany(c => c.Sessions)
.HasForeignKey(s=>s.CourseId)
.IsRequired();
我记得在某处看到说如果只有一个导航属性,那么.HasOne<Type>()
(不传参数)就可以了。显然,这是行不通的。所以总是在 .HasOne
.