实体框架。代码优先。与表之间的关系

时间:2011-05-16 21:31:07

标签: c# entity-framework asp.net-mvc-3

我有一个类似于example中的数据库的数据库。不是学生课程的情况,而是有两个与这两个表相关的共同第三个表。

我的案例是,Items,PerformanceGraphItems和PerformanceGraphSeries。

每个项目可以有多个GraphItems,GraphItem属于GraphSeries行。我如何在Entity Framework中对其进行建模,以便能够访问属于Item的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; }

    }

1 个答案:

答案 0 :(得分:2)

在我看来,你拥有的东西非常接近你想要的东西,尽管我会改变你的

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,我认为您正在尝试使用代理对象 - 请确保将所有属性设置为虚拟,否则不会发生。