【问题标题】:Setup One to Many without Foreign Key Entity Framework在没有外键实体框架的情况下设置一对多
【发布时间】:2016-09-08 12:10:15
【问题描述】:

我有以下设计。 正如我们从这张图片中看到的,一个 Episode 将有多个 EpisodePatient,每个 EpisodePatient 都将指向一个 Episode。

这是我的两个模型对应的表格。

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; }
}

如何设置EpisodeModelEpisodePatientModel 之间的一对多关系?

由于EpisodeModel 不包含EpisodePatient 的外键,我无法执行以下操作。

modelBuilder.Entity<EpisodeModel>().HasRequired(r => r.EpisodePatient).WithMany().HasForeignKey() //No foreign key

我试过了。

modelBuilder.Entity<EpisodeModel>().HasRequired(r => r.EpisodePatient);

但是使用这种方法,在从数据库中加载所有 EpisodePatientModel 时,EpisodeModel 不会延迟加载

【问题讨论】:

  • 我想知道您打算就这个问题发布多少问题。显然你的模型是错误的。 one-to-many 表示其中一侧必须有一个集合,而不是单个引用。

标签: c# asp.net-mvc entity-framework visual-studio entity-relationship


【解决方案1】:

首先,您的模型并不能反映您所说的内容。如果EpisodeModelEpisodePatientModel 之间存在一对多 关系,则您必须拥有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);

【讨论】:

  • 虽然目前与数据库中的数据存在一对多的关系,但在我的代码中,我试图“欺骗”EF 认为数据之间存在一对一的关系。我从表中选择所有 EpisodePatient 记录,并与 Episode 表连接,因此返回的数据将表现为一对一的关系。我不能在 EpisodeModel 上声明 ICollection,因为我希望能够通过它更新与 EpisodeModel 相关的单个实体,例如,episodeModel.EpisodePatient = ""。希望这是有道理的
  • @monstertjie_za,首先这不是一个好的选择。其次,要映射 一对一 关系,您需要设置modelBuilder.Entity&lt;EpisodeModel&gt;().HasOptional(r =&gt; r.EpisodePatient).WithRequired(m =&gt; m.Episode);。不需要指定 外键,因为 一对一 关系是通过它们的主键映射的。但我不确定它是否有效。
  • 不,这不起作用。我将不得不重组它目前的工作方式
【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2018-09-24
    • 2016-01-03
    相关资源
    最近更新 更多