Entity framework 实体框架、链接表和将多个表映射到单个实体
我有一个名为“Product”的实体,这个实体通过表映射,合并了6个与“Products”有1到1..0关系的表。这一切都非常有效。我想向“Products”添加另一个属性,即sBBR_rate,该值不在具有直接1到1..0关系的表中,它通过链接表进行关联,如下所示: 当我将这两个表导入EDM时,我在的“映射细节”中看不到任何方法 “产品”参考sBBR_费率。我可以引用RatesLink并将其链接到“Products”主键,但是,我不能引用BBR表 我能想到的“解决”这一问题的方法如下:Entity framework 实体框架、链接表和将多个表映射到单个实体,entity-framework,Entity Framework,我有一个名为“Product”的实体,这个实体通过表映射,合并了6个与“Products”有1到1..0关系的表。这一切都非常有效。我想向“Products”添加另一个属性,即sBBR_rate,该值不在具有直接1到1..0关系的表中,它通过链接表进行关联,如下所示: 当我将这两个表导入EDM时,我在的“映射细节”中看不到任何方法 “产品”参考sBBR_费率。我可以引用RatesLink并将其链接到“Products”主键,但是,我不能引用BBR表 我能想到的“解决”这一问题的方法如下:
- 创建视图,参照EDM中的视图李>
- 创建SP并在需要时使用函数导入检索BBR李>
- 在EDM中创建一个“费率”实体,然后将sBBR_费率拉低到该实体中。通过Product.Rates.sBBR\u rate导航到产品BBR
感谢您的输入。因为
产品
->费率链接
和费率链接
->BBR
关系的多重性为0到1,您应该能够从产品
实例访问sBBR\u费率,如下所示:
myProductInstance.RatesLink.BBR.sBBR_rate
我可以在EDM屏幕截图上看到,RatesLink
有一个Product
和BBR
属性,这表明它应该可用-是吗
另一方面,如果通常直接从
产品
访问sBBR_rate
属性是有意义的,您可能希望遵循并在产品上创建一个属性,该属性将直接返回该属性。因为产品
->费率链接
和费率链接
->BBR
关系的多重数为0到1,您应该能够从产品
实例访问sBBR_费率,如下所示:
myProductInstance.RatesLink.BBR.sBBR_rate
我可以在EDM屏幕截图上看到,RatesLink
有一个Product
和BBR
属性,这表明它应该可用-是吗
另一方面,如果通常直接从产品
访问sBBR_rate
属性是有意义的,您可能希望遵循并在产品上创建一个属性,该属性将直接返回该属性。我们使用的模型是通过使用我们发现有用的分部类来扩展实体,以便我们可以在自动生成的类中获得其他属性(我们正在使用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
事件以预加载其中一些属性。使用自定义接口,即Imatariable
,我们可以检查对象是否属于该类型,然后调用方法(Materialise
)预填充一些属性。这似乎是一个好主意,但我们没有广泛使用它-很容易加载太多的内容。如果在部分类中加载属性,则效率会更高。这就是我的经验
不管怎样-总是一个有趣的问题,祝你的开发人员好运
编辑
有一条规则,存储层中的所有内容都必须在概念层中以某种方式表示。因此,从概念层中删除表,但引入一些我认为不适用于其总体形式的属性。因此,我可以考虑另外两个选项
在数据库上创建一个视图,并将其引入,正如您已经提到的。TBH这是我将要做的
直接在xml(存储层)中使用元素,并将查询映射到精确设计的自定义实体。将此描述为实体框架的最终转义图案填充
但是请记住,如果您手动修改第2点中的XML,那么您将失去通过IDE自动更新模块的能力。我们使用的模型是通过使用我们发现有用的分部类来扩展实体,以便我们可以在自动生成的类中获得附加属性(我们正在使用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
事件以预加载其中一些属性。使用自定义接口,即Imatariable
,我们可以检查对象是否属于该类型,然后调用方法(Materialise
)预填充一些属性。这似乎是一个好主意,但我们没有广泛使用它-很容易加载太多的内容。如果在部分类中加载属性,则效率会更高。这就是我的经验
安和