2012-04-06 7 views
6

È possibile mappare una relazione uno a uno utilizzando la chiave principale e un valore discriminatore? So che per prima cosa il codice non apprezza la proprietà del discriminatore sulla classe concreta e fa riferimento solo al metodo Map.Come mappare il discriminatore di ereditarietà come chiave composta in Entity Framework?

FlightTypes { Inbound = 1, Outbound = 2} 

public class Transaction 
- int TransactionId 
- int? InboundFlightId 
- InboundTransactionFlight InboundFlight 
- int? OutboundFlightId 
- OutboundTransactionFlight OutboundFlight 

public abstract class TransactionFlight 
- TransactionFlightId 

public class InboundTransactionFlight : Flight 
- List<Transaction> InboundFor 

public class OutboundTransactionFlight : Flight 
- List<Transaction> OutboundFor 

Entity<InboundTransactionFlight>().Map(m => m.Requires("FlightTypeId").HasValue(1));   
Entity<OutboundTransactionFlight>().Map(m => m.Requires("FlightTypeId").HasValue(2)); 

/* questo è ciò che è attualmente generato */

CREATE TABLE Transactions (
    TransactionId int NOT NULL, 
    InboundFlightId int NULL, 
    OutboundFlightId int NULL 
) 

CREATE TABLE TransactionFlights (
    TransactionFlightId int NOT NULL, 
    FlightTypeId  int NOT NULL, 
    ... 
    CONSTRAINT PK_TransactionFlights PRIMARY KEY CLUSTERED (TransactionFlightId) 
) 

/* è possibile generare/mappare questo e continuare l'eredità? */

CREATE TABLE Transactions (
    TransactionId int NOT NULL, 
) 

CREATE TABLE TransactionFlights (
    TransactionId int NOT NULL, 
    FlightTypeId int NOT NULL, 
    ... 
    CONSTRAINT PK_TransactionFlights PRIMARY KEY CLUSTERED (TransactionId, FlightTypeId) 
) 

Grazie.

risposta

3

Come noto, non è possibile perché EF non consente l'uso di colonne discriminatorie in nessun'altra mappatura. Inoltre, la mappatura del target richiederà che la classe di transazione contenga anche la proprietà FlightTypeId (la classe deve avere proprietà per l'intera chiave) ma interromperà il significato dell'ereditarietà perché sarebbe possibile modificare il valore di tale proprietà e rendere incoerente l'eredità .

+0

Questo è un ottimo punto, Ladislav, e sicuramente risponde alla domanda per me. EF ha certamente sfidato le mie abitudini di progettazione del database. Per il meglio, credo. –

+0

Avrebbero potuto permetterti di leggere solo se .... – VdesmedT

Problemi correlati