我有以下设计。 正如我们从这张图片中看到的那样,一集将有多个EpisodePatients,每个EpisodePatients都会指向一集。
以下是我对应表格的两个模型。
public class EpisodeModel
{
public int ID { get; set; }
public virtual EpisodePatientModel EpisodePatient { get; set; }
}
public class EpisodePatientModel
{
public int EpisodePatientID { get; set; }
public virtual EpisodeModel Episode { get; set; }
}
如何在EpisodeModel
和EpisodePatientModel
?
由于EpisodeModel
不包含EpisodePatient的外键,我无法执行以下操作。
modelBuilder.Entity<EpisodeModel>().HasRequired(r => r.EpisodePatient).WithMany().HasForeignKey() //No foreign key
我试过这个。
modelBuilder.Entity<EpisodeModel>().HasRequired(r => r.EpisodePatient);
但是使用这种方法,从数据库加载所有EpisodePatientModel时,EpisodeModel不会加载Lazy
答案 0 :(得分:2)
我明白你需要在EpisodePatient表中有一个引用Episode表Id的外键,所以我认为你可以像这样解决它:
public class EpisodeModel
{
public int ID { get; set; }
public virtual IEnumerable<EpisodePatientModel> EpisodePatients { get; set; }
}
public class EpisodePatientModel
{
public int EpisodePatientID { get; set; }
public int EpisodeID { get; set; }
public virtual EpisodeModel Episode { get; set; }
}
然后,您的配置应该是这样的:
modelBuilder.Entity<EpisodePatientModel>().HasRequired(r => r.Episode).WithMany(e => e.EpisodePatients).HasForeignKey(r => r.EpisodeID);
答案 1 :(得分:1)
首先,您的模型并未反映您所说的内容。如果EpisodeModel
和EpisodePatientModel
之间存在一对多关系,则您必须拥有EpisodePatientModel
的集合。而且您在EpisodePatientModel
public class EpisodeModel
{
public int ID { get; set; }
public virtual ICollection<EpisodePatientModel> EpisodePatients { get; set; } // Must be collection
}
public class EpisodePatientModel
{
public int EpisodePatientID { get; set; }
public int EpisodeID { get; set; } // Foreign key to Episode
public virtual EpisodeModel Episode { get; set; }
}
然后在您的模型正确后,使用Fluent API进行映射很容易理解,按照您的说法进行映射:一个EpisodeModel
可以有多个 EpisodePatientModel
:
modelBuilder.Entity<EpisodeModel>()
.HasMany(r => r.EpisodePatients)
.WithRequired(m => m.Episode)
.HasForeignKey(m => m.EpisodeID);
或者你可以反映这个。添加这两个中的一个就足够了:
modelBuilder.Entity<EpisodePatientModel>()
.HasRequired(r => r.Episode)
.WithMany(m => m.Episode)
.HasForeignKey(m => m.EpisodeID);