Entity Framework Model Builder с внешним ключом conditioanl - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время я работаю над устаревшей sytem db, которая довольно грязная В таблице системы бронирования отелей есть таблица бронирования, которая имеет отношение один ко многим с другой системой бронирования (например, бронирование гостиницы, бронирование поезда) на основе systemid
Столик - Бронирование
Столбец Reservation_id (int) | System_id (int) | Customer_id |
45432 | может быть 1,2,3 и т. д. | 343 |


например, системный идентификатор 1 может быть отелем, 2 - поездом

Таблица - [Система] _Система бронирования может быть гостиница, поезд или рейс
Столбец Reservation_id (int) | create_date (datetime) | другие столбцы 45432 |

В настоящее время для загрузки информации о бронировании мы запрашиваем таблицу резервирования, а не по системному идентификатору запрашиваем соответствующую системную таблицу бронирования. Каждое бронирование может иметь 0..1 * для многих отношений с системой бронирования Как я могу создать EF Mdel Builder вокруг этого. Я попробовал следующее

    [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 голосов
/ 29 августа 2018

Это выглядит примерно как модель наследования с использованием Table-per-Type, однако System_Id больше похож на попытку Table-per-Hierarchy. Если таблицы подкласса (Hotel_Reservation и т. Д.) Содержат идентификатор резервирования, вы должны иметь возможность сопоставить его с таблицей для каждого типа и полностью игнорировать SystemId в отображении отношений. По сути, вы хотите рассматривать Резервирование как базовый класс с конкретными типами резервирования, расширяющими его. Оттуда вы сможете запросить конкретные типы бронирования или базовое бронирование.

Прочитайте: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

Здесь описывается, как устанавливаются отношения в EF, а также отображаются другие сопоставления структуры данных наследования, в том числе Table-per-Hierarchy.

...