2016-05-08 10 views
0

Ich versuche, One-to-One-Beziehung mit EF-Code zuerst für die folgenden Klassen zu organisieren. Bus ist eine Hauptklasse und Schedule ist abhängig.Eins-zu-eins-Beziehung Code Zuerst nicht EF-Konventionen folgen

public class Bus 
{ 
    public int Id { get; set; } 
    public virtual Schedule Schedule { get; set; } 
} 

public class Schedule 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime BusRouteStartTime { get; set; } 
    public DateTime BusRouteEndTime { get; set; } 
    public DateTime ArrivalTime { get; set; } 
    public DateTime DepartureTime { get; set; } 

    [ForeignKey("Bus")] 
    public int BusId { get; set; } 
    public virtual Bus Bus { get; set; } 
} 

Ich machte diese Klassen mit this Tutorial. Wenn ich Enable-Migrationen in PCM und ich bekomme diese Fehlermeldung:

Bus_Schedule_Target: : Multiplicity is not valid in Role 'Bus_Schedule_Target' in relationship 'Bus_Schedule'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

ich diesen Fehler google und this Lösung finden. Ich ändere OnModelCreating():

modelBuilder.Entity<Schedule>().HasKey(s => s.Id); 
modelBuilder.Entity<Bus>() 
      .HasRequired(s => s.Schedule) 
      .WithRequiredPrincipal(b => b.Bus); 

Leider hat es nicht geholfen. Ich google weiter, wenn ich verstehe, dass standardmäßig Id der abhängigen Klasse Primär- und Fremdschlüssel gleichzeitig sein muss. Es passt mir nicht, weil es später Probleme mit Ablegetabellen verursachen kann, zum Beispiel beim kaskadierenden Löschen.

Bitte helfen Sie mir, ich verstehe, dass es eine Art doppelte Frage ist, aber es wird wirklich besser sein, wenn es so gemacht werden kann.

Antwort

0

können Sie einen Trick ausführen - Erstellen einer Eins-zu-viele-Beziehung, sondern maskieren sie als One-to-one:

public class Bus 
{ 
    public int Id { get; set; }   
    [Obsolete] 
    public virtual ICollection<Schedule> Schedules { get; set; } 

    //Here I implemented primitive logic, you should expand it by your own. 
    [NotMapped] 
    public Schedule Schedule { 
     get { 
      return Schedules.FirstOrDefault(); 
     } 
     set {     
      Schedules.Add(value); 
     } 
    } 
} 

public class Schedule 
{ 
    //other stuff... 

    [Index(IsUnique = true)]//This index will prevent from inserting duplicates 
    public int BusId { get; set; } 
    public virtual Bus Bus { get; set; } 
} 

Jetzt können Sie mit diesen Klassen arbeiten, wie Sie erste gewünscht, alle, was Sie sollte tun ist ignorieren Schedules Eigenschaft, deshalb habe ich es mit Obsolete Attribut für die Erinnerung daran markiert.