我有一个名为“Product”的实体,该实体通过表映射合并6个与“Products”具有1到1..0关系的表。这一切都很有效。我想要添加到“Products”中的另一个属性是sBBR_rate,这个值不在具有直接1到1..0关系的表中,它通过链接表关联如下:
当我将两个表导入EDM时,我无法在“映射详细信息”中看到一种方法 “产品”引用sBBR_rate。我可以参考RatesLink并将其链接到“Products”主键,但是,我无法引用BBR表。
我能想到的“围绕”这个方法如下:
有没有更好的方法可以做到这一点,感觉不像软糖?也许直接编辑EDM的Mapping或Conceptual层的XML?
感谢您的意见。
答案 0 :(得分:2)
因为Product
上的多重性 - > RatesLink
和RatesLink
- > BBR
关系为0到1,您应该能够从Product
实例访问sBBR_rate,如下所示:
myProductInstance.RatesLink.BBR.sBBR_rate
我可以在EDM屏幕截图中看到RatesLink
有Product
和BBR
属性,这表明这应该可用 - 是吗?
在旁注中,如果通常直接从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
)来预填充一些属性。这似乎是一个好主意,但我们没有广泛使用它 - 很容易加载太多的东西。如果对部分类中的属性执行加载,则会变得更有效。只是我的经历。
修改强>
规则是商店图层中的所有内容都必须在概念图层中以某种方式表示。因此,从概念层中删除表但是通过一些我认为不会以其粗略形式工作的属性。因此,我可以考虑另外两个选项
请记住 - 如果您在第2点手动修改XML,那么您将失去通过IDE自动更新模块的能力
答案 2 :(得分:1)
我最终创建了一个视图,然后在EDM中链接了这个视图,这是一种享受。