2015-09-25 5 views
0

У меня есть очень простая схема, упрощенная далее на этот вопросEF необязательно один ко многие кратность ошибки

Table: Airport 
IATA char(3) Primary Key 
Name varchar(20) 

Table: Airport_Terminal 
IATA char(3) (comp key1) 
TerminalName (comp key2) 

POCOs 
public sealed class Airport 
{ 
    [Key] 
    public string IATA { get; set; }  

    public string Name { get; set; } 

    public ICollection<AirportTerminal> Terminals { get; set; } 
} 

    public class AirportTerminal 
{ 
    [Key, Column(Order = 0)] 
    public string IATA { get; set; } 

    [Key, Column(Order = 1)] 
    public string Terminal { get; set; } 

    public Airport Airport { get; set; } 

} 

AirportTerminal Конфигурацию

modelBuilder.Entity<AirportTerminal>() 
    .HasOptional<Airport>(s => s.Airport) 
    .WithMany(s => s.Terminals) 
    .HasForeignKey(s => s.IATA); 

Некоторых аэропорты (в моем приложении) несколько терминалов и некоторых не. Я просто хочу отреагировать на недвижимость Терминалов, если для данного аэропорта установлены Терминалы. Если я ввожу одну запись для каждого аэропорта, эта конфигурация работает. Но когда я пытаюсь для поиска любого аэропорта, я получаю:

"One or more validation errors were detected during model generation: Multiplicity conflicts with the referential constraint in Role 'AirportTerminal_Airport_Target' in relationship 'AirportTerminal_Airport'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'." 

Исследования показывают, что эта ошибка возникает, когда ненулевое свойство существует на дополнительном элементе, поэтому он не может быть установлены в нуле. AirportTerminal содержит две строки с нулевым значением.

Любые идеи?

ответ

1

Рассмотрите возможность использования только ключа для таблиц. Это лучше, чем многократный ключ. Ограничьте индекс индекса, чтобы обеспечить уникальность свойств IATA и Terminal.

POCO которые:

public sealed class Airport 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public string IATA { get; set; }  

    public string Name { get; set; } 

    public ICollection<AirportTerminal> Terminals { get; set; } 
} 

public class AirportTerminal 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public string IATA { get; set; } 

    public string Terminal { get; set; } 

    public Airport Airport { get; set; } 

    public Guid? AirportId { get; set; } 
} 

конфигурации:

modelBuilder.Entity<AirportTerminal>() 
    .HasOptional<Airport>(s => s.Airport) 
    .WithMany(s => s.Terminals) 
    .HasForeignKey(s => s.AirportId); 
+0

Пока вы отвечали на это .. я сделал именно это. Благодарю. .Это отлично работает :) –