Как мне сопоставить Entity Framework много-много-таблицу с дополнительной ключевой частью? - PullRequest
0 голосов
/ 17 марта 2012

Есть ли способ отобразить это так, чтобы родительские таблицы Airport и Flight отображали только соответствующую часть внешнего составного ключа?

Использование EF4.3 с Code First и Fluid API.

Каждый рейс приземляется в одном или нескольких аэропортах в определенном порядке. Без свойства дополнительного ключа FlightOrder это отображение работает.

Airport
- string Code
- List<AirportFlight> AirportFlights

Flight
- string Number
- List<AirportFlight> AirportFlights

AirportFlight
- string AirportCode
- string FlightNumber
- int FlightOrder

public AirportConfiguration() {
    HasKey(x => x.Code);
    HasMany(x => x.AirportFlights).WithRequired().HasForeignKey(x => x.AirportCode);
}

public AirportFlightConfiguration() {
    HasKey(x => new { x.AirportCode, x.FlightNumber, x.FlightOrder });
}

public FlightConfiguration()
{
    HasKey(x => x.Number);
    HasMany(x => x.AirportFlights).WithRequired().HasForeignKey(x => x.FlightNumber);
}

Это схема, сгенерированная Entity Framework:

CREATE TABLE Airports(
Code nvarchar(128) NOT NULL,
AirportFlight_AirportCode nvarchar(128) NULL, -- *** DO NOT WANT THIS ***
AirportFlight_FlightNumber nvarchar(128) NULL, -- *** DO NOT WANT THIS ***
AirportFlight_FlightOrder int NULL, -- *** DO NOT WANT THIS ***

CREATE TABLE Flights(
Number nvarchar(128) NOT NULL,
AirportFlight_AirportCode nvarchar(128) NULL, -- *** DO NOT WANT THIS ***
AirportFlight_FlightNumber nvarchar(128) NULL, -- *** DO NOT WANT THIS ***
AirportFlight_FlightOrder int NULL, -- *** DO NOT WANT THIS ***

CREATE TABLE AirportFlights(
AirportCode nvarchar(128) NOT NULL,
FlightNumber nvarchar(128) NOT NULL,
FlightOrder int NOT NULL,
CreatedDate datetime NOT NULL,
RowVersion varbinary(max) NULL,
CONSTRAINT PK_AirportFlights PRIMARY KEY CLUSTERED 
(
    AirportCode ASC,
    FlightNumber ASC,
    FlightOrder ASC
)

ALTER TABLE AirportFlights  WITH CHECK ADD  CONSTRAINT FK_AirportFlights_Airports_AirportCode FOREIGN KEY(AirportCode)
REFERENCES Airports (Code)

ALTER TABLE AirportFlights  WITH CHECK ADD  CONSTRAINT FK_AirportFlights_Flights_FlightNumber FOREIGN KEY(FlightNumber)
REFERENCES Flights (Number)

-- *** DO NOT WANT THIS ***
ALTER TABLE Airports  WITH CHECK ADD  CONSTRAINT FK_Airports_AirportFlights_AirportFlight_AirportCode_AirportFlight_FlightNumber_AirportFlight_FlightOrder FOREIGN KEY(AirportFlight_AirportCode, AirportFlight_FlightNumber, AirportFlight_FlightOrder)
REFERENCES AirportFlights (AirportCode, FlightNumber, FlightOrder)

-- *** DO NOT WANT THIS ***
ALTER TABLE Flights  WITH CHECK ADD  CONSTRAINT FK_Flights_AirportFlights_AirportFlight_AirportCode_AirportFlight_FlightNumber_AirportFlight_FlightOrder FOREIGN KEY(AirportFlight_AirportCode, AirportFlight_FlightNumber, AirportFlight_FlightOrder)
REFERENCES AirportFlights (AirportCode, FlightNumber, FlightOrder)

Спасибо.

Исправлено:

Эти объекты были в объекте AirportFlights

- List<Airport> Airports
- List<Flight> Flights

1 Ответ

0 голосов
/ 17 марта 2012

Поскольку вы сопоставили таблицу соединений как сущность, у нее нет навигационных свойств коллекции к Airport и Flight.Вы должны смоделировать это как два отношения один ко многим.Удалите List<Airport> Airports и List<Flight> Flights.

AirportFlight
- string AirportCode
- string FlightNumber
- int FlightOrder

Однако вы можете разместить свойства навигационного элемента Airport и Flight на AirportFlight объекте, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...