Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架、链接表和将多个表映射到单个实体_Entity Framework - Fatal编程技术网

Entity framework 实体框架、链接表和将多个表映射到单个实体

Entity framework 实体框架、链接表和将多个表映射到单个实体,entity-framework,Entity Framework,我有一个名为“Product”的实体,这个实体通过表映射,合并了6个与“Products”有1到1..0关系的表。这一切都非常有效。我想向“Products”添加另一个属性,即sBBR_rate,该值不在具有直接1到1..0关系的表中,它通过链接表进行关联,如下所示: 当我将这两个表导入EDM时,我在的“映射细节”中看不到任何方法 “产品”参考sBBR_费率。我可以引用RatesLink并将其链接到“Products”主键,但是,我不能引用BBR表 我能想到的“解决”这一问题的方法如下:

我有一个名为“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
有没有更好的方法让我感觉不那么像奶油软糖?也许可以直接编辑EDM的映射或概念层的XML


感谢您的输入。

因为
产品
->
费率链接
费率链接
->
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
    )预填充一些属性。这似乎是一个好主意,但我们没有广泛使用它-很容易加载太多的内容。如果在部分类中加载属性,则效率会更高。这就是我的经验

    安和