Telerik ScheduleView WPF EF Core Code First关联配置问题咨询
.NET Core EF Core 关联配置问题解答
问题1:移除WithOptional改用MySQL是否可行?
原配置是EF6的Fluent API写法,WithOptional用来明确多端(SqlAppointment/SqlExceptionAppointment)与一端(TimeMarker)的关联是可选的(因为外键TimeMarkerID是可空int类型)。
在EF Core中,当外键字段为可空类型时,你修改后的配置完全可行:
modelBuilder.Entity<TimeMarker>() .HasMany(e => e.SqlAppointments) .HasForeignKey(e => e.TimeMarkerID); modelBuilder.Entity<TimeMarker>() .HasMany(e => e.SqlExceptionAppointments) .HasForeignKey(e => e.TimeMarkerID);
EF Core会自动识别可空外键对应的是可选关联,效果和原EF6的WithOptional完全一致,且MySQL数据库本身支持可空外键,不存在兼容性问题。
问题2:共享主键的一对一关联在EF Core中的配置
原EF6配置对应的是共享主键的一对一关联:SqlExceptionOccurrence可选关联SqlExceptionAppointment,但SqlExceptionAppointment必须对应一个SqlExceptionOccurrence,且两者用ExceptionId作为主键(无单独外键字段)。
在EF Core中,需要用HasOne+WithOne来配置这种一对一关系,同时指定依赖实体的主键作为外键,配置代码如下:
modelBuilder.Entity<SqlExceptionAppointment>() .HasOne(e => e.SqlExceptionOccurrence) .WithOne(e => e.SqlExceptionAppointment) .HasForeignKey<SqlExceptionOccurrence>(e => e.ExceptionId) .OnDelete(DeleteBehavior.Cascade);
- 将
SqlExceptionAppointment设为主体(对应原配置中WithRequired的一端,即必须存在关联),SqlExceptionOccurrence作为依赖 HasForeignKey<SqlExceptionOccurrence>(e => e.ExceptionId)指定依赖实体的主键作为外键,匹配原共享主键的逻辑OnDelete(DeleteBehavior.Cascade)对应原配置的WillCascadeOnDelete(),开启级联删除
内容的提问来源于stack exchange,提问作者traderset
相关产品推荐
相关产品推荐

