具有conditioanl外键的实体框架模型构建器

时间:2018-08-29 01:09:05

标签: c# entity-framework entity-framework-6

当前,我正在处理旧的sytem db,这很混乱 在酒店预订系统表中,我们有一个预订表,该表与基于systemid的不同预订系统(例如酒店预订,火车预订)具有一对多的关系
表格-预订
列Reservation_id(int)| System_id(int)| Customer_id |
        45432 |可以是1,2,3等| 343 |


例如系统ID 1可以是旅馆,2是火车等。  

表格-[系统] _预订系统可以是酒店,火车或飞机
列Reservation_id(int)| create_date(datetime)|其他列         45432 |

当前要加载预订详细信息,我们查询预订表,而不是基于系统ID查询相应的预订系统表。每个预订与预订系统之间可以有0..1 *个关联。 我如何围绕此创建EF mdel构建器。 我尝试了以下

    [Table("Hotel_Reservation")]    
    public class HotelReservation
{
    public int Reservation_id { get; set; }
    public Virtual Reservation ReservationInfo { get; set; }
    //other properties etc
}
    [Table("Reservation")]    
    public class Reservation
{
    public Reservation()
    {
        HotelReservations  = new HashSet<HotelReservation>();
        TrainReservations  = new HashSet<TrainReservation>();
    }
    public int Reservation_id { get; set; }
    public int SystemID { get; set; }
    public virtual ICollection<HotelReservation> HotelReservations { get; set; }
    public virtual ICollection<TrainReservation> TrainReservations { get; set; }
    //other properties etc
}
//On model builder class contains
        Builder.Entity<TrainReservation>()
            .HasOptional(x => x.ReservationInfo)
            .WithMany(x => x.TrainReservations )
            .HasForeignKey(x => x.Reservation_id);

但是在初始化时出现以下错误 多重性与角色中的引用约束冲突。..由于从属角色中的所有属性都是不可为空的,因此主要角色的多重性必须为'1'。

1 个答案:

答案 0 :(得分:2)

这看起来大致像是使用每个类型表的继承模型,但是System_Id看起来更像是尝试每个层次表的尝试。如果子类表(Hotel_Reservation等)拥有一个保留ID,那么您应该能够将其映射为“每种类型的表”,而在关系映射中完全忽略SystemId。本质上,您希望将Reservation作为具有扩展其特定保留类型的基类。从那里,您应该能够查询特定的预订类型或基本预订。

已通读:https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

这概述了如何在EF中建立关系以及其他继承数据结构映射,包括每个层次的表。