Entity Framework Core fluent api一对多和一对一产生重复的外键
Posted
技术标签:
【中文标题】Entity Framework Core fluent api一对多和一对一产生重复的外键【英文标题】:Entity Framework Core fluent api One-To-Many and One-To-One produces duplicate foreign key 【发布时间】:2018-07-04 06:27:52 【问题描述】:我正在将我的 ASP.NET MVC 项目更改为带有 Entity Framework Core 和 Fluent API 的 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】:我找到了解决办法。我将上下文更改为:
builder.Entity<Session>()
.HasOne(s=>s.Course)
.WithMany(c => c.Sessions)
.HasForeignKey(s=>s.CourseId)
.IsRequired();
我记得我在某个地方看到过,如果只有一个导航属性,那么.HasOne<Type>()
(没有传递参数)可以使用。显然,它不起作用。所以总是在.HasOne
中使用lambda参数。
【讨论】:
始终使用 正确 重载。如果您有导航属性,请使用 lambda 重载。如果您没有导航属性,请使用无参数重载。 这让我明白了……我真希望他们已经确定了语法。这是对 dotnet 框架版本的改进,但有时几乎同样令人困惑。以上是关于Entity Framework Core fluent api一对多和一对一产生重复的外键的主要内容,如果未能解决你的问题,请参考以下文章
EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?
张高兴的 Entity Framework Core 即学即用:创建第一个 EF Core 应用