每个层次表和继承实现问题

时间:2010-05-18 09:59:07

标签: .net entity-framework-4 table-per-hierarchy

我正在将旧的ASP应用程序迁移到现代.NET版本,以减少我们正在研究.NET 4.0实体框架的开发时间。但是,我们似乎在这个问题上遇到了障碍。

鉴于我们数据库的一小部分: 表OBJECT,包含汽车列表及其各自的属性。我们还有一个表OBJECT_OPTIONS,对于OBJECT中的给定汽车,它包含一个OPTIONS,ACCESSORIES和STANDARD EQUIPMENT列表。这三种类型都具有相同的字段,因此存储在同一个表中。列ncopt_type用于区分不同的列表。可能的值有:'opt','acc'和'sta'。表OBJECT_OPTIONS通过ncopt_obj_id链接到OBJECT,表示OBJECT表中的唯一汽车(obj_id)。

我们的目标是为OBJECT实体提供3个链接到不同OBJECT_OPTIONS列表的属性: - 属性选项 - 财产配件 - 物业STANDARDEQUIPMENT

我们已尝试通过继承模型对每个层次表进行不同的教程和演练,但未成功创建可构建模型。

从技术上讲,我们所做的是:

  • 创建实体OBJECT
  • 创建实体OBJECT_OPTIONS,使其成为抽象
  • 使用基本类型OBJECT_OPTIONS添加实体OPTION,ACCESSORY和STANDARD_EQUIP
  • 在ncopt_type ='...'
  • 上为所有三个表添加条件
  • 向OBJECT添加3个导航属性,所有这些属性都链接到其中一个继承的实体:OPTIONS,ACCESSORIES和STANDAARD_EQUIPMENT

在此设置过程中出现了一堆错误,但我们最终得到了这个错误:

  

错误3032:从第250,286行开始映射片段时出现问题:EntityTypes NCO.Model.OPTION,NCO.Model.ACCESSOIRE,NCO.Model.STANDAARD_EQUIP被映射到表OBJECT_OPTIES中的相同行。映射条件可用于区分这些类型映射到的行。

但是所有三个物体都存在条件。

我找不到解决这个问题的方法,并且已经花费了太多时间。我们目前正在使用一种解决方法,但我希望能够解决这个问题,因为在项目结束时这种情况会再出现几次。

任何帮助表示感谢,如果您需要更多信息,请给我发表评论或发送电子邮件。

1 个答案:

答案 0 :(得分:1)

我不相信你可以100%从EF设计师那里做到这一点,但你可以这样做:

  
      
  1. 创建实体OBJECT(我已为此示例重命名为“Vehicle”)
  2.   
  3. 创建实体OBJECT_OPTIONS,使其成为抽象
  4.   
  5. 使用basetype添加实体OPTION,ACCESSORY和STANDARD_EQUIP   OBJECT_OPTIONS
  6.   
  7. 在ncopt_type ='...'
  8. 上为所有三个表添加条件   

然后使用Vehicle的分部类添加所需的属性:

using System.Collections.Generic;
using System.Linq;

public partial class Vehicle
{
    public IEnumerable<ACCESSORY> Accessories
    {
        get { return this.OBJECT_OPTIONS.OfType<ACCESSORY>(); }
    }

    public IEnumerable<OPTION> Options
    {
        get { return this.OBJECT_OPTIONS.OfType<OPTION>(); }
    }

    public IEnumerable<STANDARD_EQUIP> StandardEquipments
    {
        get { return this.OBJECT_OPTIONS.OfType<STANDARD_EQUIP>(); }
    }
}