【问题标题】:Table-per-hierarchy and inheritance implementation issueTable-per-hierarchy 和继承实现问题
【发布时间】:2010-05-18 09:59:07
【问题描述】:

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

Given 是我们数据库的一小部分: 包含汽车列表及其各自属性的表 OBJECT。我们还有一个表 OBJECT_OPTIONS,其中包含 OBJECT 中给定汽车的选项、附件和标准设备列表。这三种类型都具有相同的字段,因此存储在同一个表中。 ncopt_type 列用于区分不同的列表。可能的值为:“opt”、“acc”和“sta”。表 OBJECT_OPTIONS 通过 ncopt_obj_id 链接到 OBJECT,ncopt_obj_id 表示表 OBJECT 中唯一的汽车 (obj_id)。

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

我们尝试了不同的教程和演练关于通过继承模型的每层次表,但未能成功创建可构建模型。

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

  • 创建实体 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 中的相同行。映射条件可用于区分这些类型映射到的行。

但所有三个对象都存在一个条件。

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

感谢您的帮助,如果您需要更多信息,请给我留言或发送电子邮件。

【问题讨论】:

  • 看来不是。我也有同样的问题,...也许只有我们两个人!
  • 您能否附上 edmx 中相关表格和相关实体的图像? - 这将有助于澄清你想要做什么。编辑后在这里发表评论。

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


【解决方案1】:

我不相信您可以在 EF 设计器中 100% 做到这一点,但您可以这样做:

  1. 创建实体 OBJECT(我已将这个“车辆”重命名为示例)
  2. 创建实体 OBJECT_OPTIONS,使其抽象
  3. 使用基本类型添加实体 OPTION、ACCESSORY 和 STANDARD_EQUIP OBJECT_OPTIONS
  4. 为 ncopt_type = '...' 上的所有三个表添加条件

然后使用 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>(); }
    }
}

【讨论】:

  • 嗨,史蒂夫,我们已经放弃了这种方法,因为我们花了很长时间才弄清楚。我们可能会在未来的版本中再次使用它。当我们这样做时,我会尝试您的解决方案。目前看来您的解决方案可能有效,因此我将其标记为已接受。感谢您花时间回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多