Bra*_*che 5 .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,ncopt_obj_id表示表OBJECT中的唯一汽车(obj_id).
我们的目标是为OBJECT实体提供链接到不同OBJECT_OPTIONS列表的3个属性: - 属性OPTIONS - 属性ACCESSORIES - 属性STANDARDEQUIPMENT
我们已经通过继承模型尝试了关于每个层次表的不同教程和演练,但是没有成功创建可构建模型.
从技术上讲,我们所做的是:
在此设置过程中会出现一堆错误,但最终会出现这样的错误:
错误3032:从第250,286行开始映射片段时出现问题:EntityTypes NCO.Model.OPTION,NCO.Model.ACCESSOIRE,NCO.Model.STANDAARD_EQUIP被映射到表OBJECT_OPTIES中的相同行.映射条件可用于区分这些类型映射到的行.
但是,所有三个对象都存在条件.
我找不到解决这个问题的方法,并且已经花费了太多时间.我们目前正在使用一种解决方法,但是我希望能够解决这个问题,因为在项目结束时这种情况会再出现几次.
任何帮助表示感谢,如果您需要更多信息,请给我发表评论或发送电子邮件.
我不相信您可以在 EF 设计器中 100% 地完成此操作,但您可以这样做:
- 创建实体对象(我已将此示例重命名为“车辆”)
- 创建实体OBJECT_OPTIONS,使其抽象
- 添加实体 OPTION、ACCESSORY 和 STANDARD_EQUIP 均使用基本类型 OBJECT_OPTIONS
- 在 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>(); }
}
}
Run Code Online (Sandbox Code Playgroud)