2011-05-16 105 views
1

我有一个类似于这个example中的数据库。不是学生课程场景,而是有两个共同的三分之一相关的表格。实体框架。代码第一。与表之间的关系

我的情况是,Items,PerformanceGraphItems和PerformanceGraphSeries。

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

    } 

回答

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

取决于您的情况。

这是因为你没有真正建模一个数据库,它在ItemPerformanceGraphSeries之间有直接连接 - 所以你不希望你的数据库以这种方式生成。但是,这仍然允许您在一个属性中访问它(而不必在任何地方执行该查询)。

而且,由于你在大多数地方使用virtual,我假设你试图去代理对象 - 确保你设置所有你的属性是虚拟的,否则也不会发生。

相关问题