实体框架.代码优先.与介于两者之间的表的关系
本文关键字:两者之间 关系 框架 代码 实体 | 更新日期: 2023-09-27 17:56:42
我有一个类似于本例中的数据库。不是学生课程方案,而是 2 个表,它们具有与这两个表相关的共同第三个表。
我的情况是,Items,PerformanceGraphItems和PerformanceGraphSeries。
每个项目可以有多个图形项,并且一个图形项属于图形系列行。如何在实体框架中对其进行建模,以便能够访问属于项的 GraphSeries?
像这样的东西。
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<PerformanceGraphItem> PerformanceGraphItems { get; set; }
public virtual ICollection<PerformanceGraphSeries> PerformanceGraphSeries { get; set; }
}
public class PerformanceGraphItem
{
[Key]
public int Id { get; set; }
[ForeignKey("Item")]
public int ItemId { get; set; }
public int SeriesId { get; set; }
public short Year { get; set; }
public double RateOfReturn { get; set; }
public virtual Item Item { get; set; }
[ForeignKey("SeriesId")]
public virtual PerformanceGraphSeries PerformanceGraphSeries { get; set; }
}
public class PerformanceGraphSeries
{
public int id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<PerformanceGraphItem> PerformanceGraphItems { get; set; }
}
在我看来,你所拥有的与你想要的非常接近,尽管我会改变你的
public virtual ICollection<PerformanceGraphSeries> PerformanceGraphSeries { get; set; }
行改为
public virtual IEnumerable<PerformanceGraphSeries> PerformanceGraphSeries
{
get
{
return PerformanceGraphItems.Select(pgi => pgi.PerformanceGraphSeries);
}
}
或
public virtual IEnumerable<PerformanceGraphSeries> PerformanceGraphSeries
{
get
{
return PerformanceGraphItems.Select(pgi => pgi.PerformanceGraphSeries)
.Distinct();
}
}
具体取决于你的方案。
Thius 是因为您并没有真正对Item
和PerformanceGraphSeries
之间有直接连接的数据库进行建模 - 所以您不希望以这种方式生成数据库。但这仍然允许您在一个属性中访问它(而不必在任何地方执行该查询)。
另外,由于您在大多数地方都使用virtual
,因此我假设您正在尝试使用代理对象 - 确保您将所有属性设置为虚拟属性,否则它不会发生。