实体框架.代码优先.与介于两者之间的表的关系

本文关键字:两者之间 关系 框架 代码 实体 | 更新日期: 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 是因为您并没有真正对ItemPerformanceGraphSeries之间有直接连接的数据库进行建模 - 所以您不希望以这种方式生成数据库。但这仍然允许您在一个属性中访问它(而不必在任何地方执行该查询)。

另外,由于您在大多数地方都使用virtual,因此我假设您正在尝试使用代理对象 - 确保您将所有属性设置为虚拟属性,否则它不会发生。