实体框架,链接表并将多个表映射到单个实体

时间:2012-01-25 12:16:43

标签: entity-framework

我有一个名为“Product”的实体,该实体通过表映射合并6个与“Products”具有1到1..0关系的表。这一切都很有效。我想要添加到“Products”中的另一个属性是sBBR_rate,这个值不在具有直接1到1..0关系的表中,它通过链接表关联如下:

SQL server diagram

当我将两个表导入EDM时,我无法在“映射详细信息”中看到一种方法 “产品”引用sBBR_rate。我可以参考RatesLink并将其链接到“Products”主键,但是,我无法引用BBR表。

EDM

我能想到的“围绕”这个方法如下:

  • 创建视图,引用EDM中的视图。
  • 创建SP并使用函数导入在需要时检索BBR。
  • 在EDM中创建一个“Rate”实体,然后可以将sBBR_rate绘制到其中。通过Product.Rates.sBBR_rate导航到Products BBR。

有没有更好的方法可以做到这一点,感觉不像软糖?也许直接编辑EDM的Mapping或Conceptual层的XML?

感谢您的意见。

3 个答案:

答案 0 :(得分:2)

因为Product上的多重性 - > RatesLinkRatesLink - > BBR关系为0到1,您应该能够从Product实例访问sBBR_rate,如下所示:

myProductInstance.RatesLink.BBR.sBBR_rate

我可以在EDM屏幕截图中看到RatesLinkProductBBR属性,这表明这应该可用 - 是吗?

在旁注中,如果通常直接从sBBR_rate访问Product属性是有意义的,您可能需要关注law of demeter并在{{{{}}上创建一个属性1}}直接返回它。

答案 1 :(得分:2)

我们使用的模型是通过使用我们发现有用的部分类来扩展实体,这样我们就可以在自动生成的类中获得其他属性(我们使用POCO T4模板来自动生成但是我相信这可以用作以及默认的实体对象生成)。

所以我们会有

//.. this one is from the T4 template
public partial class Product
{
    //.. all the autogenerated methods
}

并且在一个未自动化的单独文件中

//.. now in a separate file created by me
public partial class Product
{
   //.. my custom properties and methods to make the entities more usable
   public string BBRRate
   {
     get {return this.RatesLink.BBR.sBBR_rate; } 
   }
}

这意味着我可以做到

myProduct.BBRRte

我知道还有其他方法可以通过修改edmx文件来实现这一点,但我们发现这个方法很容易实现。您只需要观察性能,因为您可能正在加载额外的数据。我们也开启了LazyLoading,但你需要做更多的工作

我们还尝试挂钩ObjectContext类中的ObjectMaterialized事件来预加载其中的一些属性。使用自定义接口,即IMaterialisable,我们可以检查对象是否属于该类型,然后调用方法(Materialise)来预填充一些属性。这似乎是一个好主意,但我们没有广泛使用它 - 很容易加载太多的东西。如果对部分类中的属性执行加载,则会变得更有效。只是我的经历。

无论如何 - 总是一个有趣的问题,再次与你的开发运气好运。

修改

规则是商店图层中的所有内容都必须在概念图层中以某种方式表示。因此,从概念层中删除表但是通过一些我认为不会以其粗略形式工作的属性。因此,我可以考虑另外两个选项

  1. 在数据库上创建一个视图,并按照您已经提到的那样将其引入。 TBH这就是我要做的事。
  2. 直接在xml(商店图层)中使用DefiningQuery元素,并将查询映射到您的确切设计的自定义实体。 Julie Lerman将此描述为实体框架的终极逃生舱。
  3. 请记住 - 如果您在第2点手动修改XML,那么您将失去通过IDE自动更新模块的能力

答案 2 :(得分:1)

我最终创建了一个视图,然后在EDM中链接了这个视图,这是一种享受。