2016-04-26 7 views
0

Die Frage ist eine, die ich eine Fehlermeldung lesen bin immer:0..1 N Referenzierung Relation -> Fehlermeldung Ich verstehe nicht

Die INSERT-Anweisung in Konflikt mit der FOREIGN KEY-Einschränkung „FK_dbo .Users_dbo.People_Id ". Der Konflikt trat in Datenbank "TrialDb", Tabelle "dbo.People", Spalte 'Id'

Ich versuche folgendes zu implment:

  • User kann ein Person zugewiesen und Person viele haben User zugewiesen
  • jede Entität, dh Person oder jede andere, wird einen Ersteller und eine wechselnde Benutzergruppe haben.

Die Beziehung shold one-way, was bedeutet, dass User keine Navigationseigenschaft für Person benötigt.

Was ich tue, versucht, eine User zu meiner Datenbank hinzuzufügen, die den oben genannten Fehler ergibt.

Hier ist die User und Person Klassendefinition (abgekürzt)

public class User 
{ 
    public int Id {get; set;} 

    public int? PersonId {get; set; } 
    public virtual Person Person {get; set;} 

    // two self-refencing properties 
    public int CreatorId {get; set; } 
    public virtual Person Creator{get; set;} 

    public int ChangingUserId {get; set; } 
    public virtual Person ChangingUser {get; set;} 

    public byte[] RowVersion {get; set;} 
} 

public class Person 
{ 
    public int Id {get; set;} 

    public virtual ICollection<User> Users {get; set;} 

    public byte[] RowVersion {get; set;} 
} 

Meine Konfigurationsklassen für die beiden Einheiten sind wie folgt:

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     HasRequired (p => p.Creator).WithRequiredPrincipal().WillCascadeOnDelete (false); 
     HasRequired (p => p.ChangingUser).WithRequiredPrincipal().WillCascadeOnDelete (false); 

     // 0..1 : N relation 
     HasOptional (p => p.Person).WithMany (p => p.Users).HasForeignKey (p => p.PersonId); 

     Property (p => p.RowVersion).IsRowVersion(); 
    } 
} 

public class PersonMap : EntityTypeConfiguration<Person> 
{ 
    public PersonMap() 
    { 
     HasRequired (p => p.Creator).WithRequiredPrincipal().WillCascadeOnDelete (false); 
     HasRequired (p => p.ChangingUser).WithRequiredPrincipal().WillCascadeOnDelete (false); 

     // 0..1 : N relations - tried this as well - same result 
     //HasOptional (p => p.Company).WithMany (p => p.Employees).HasForeignKey (p => p.CompanyId); 
     //HasOptional (p => p.Facility).WithMany (p => p.People).HasForeignKey (p => p.FacilityId); 

     Property (p => p.RowVersion).IsRowVersion(); 
    } 
} 

Kann mir jemand helfen mit diesem? Es wäre am besten zu schätzen!

Antwort

0

Die People_Id, die nicht in Ihrem Modell ist, zeigt an, dass EF sie eingefügt hat, weil Ihr flüssiger Code falsch ist. Ihre Benutzertabelle verweist 3 Mal auf Person, aber Ihr flüssiger Code teilt EF lediglich mit, wie eine FK (PersonId) zugeordnet werden soll. Sie müssen die anderen 2 ändern, um die ForeignKey-Zuweisung mithilfe von HasForeignKey oder MapKey anzugeben (leider ist kein Testprojekt verfügbar).

Versuchen Sie so etwas für usermap:

HasRequired(p => p.Creator).WithMany().HasForeignKey(p => p.CreatorId).WillCascadeOnDelete (false); 
HasRequired(p => p.ChangingUser).WithMany().HasForeignKey(p => p.ChangingUserId).WillCascadeOnDelete (false); 

Ich bin nicht sicher, was Sie versuchen, in Ihrem PersonMap da Ihr fließend Code zu tun verweist 2 Navigationseigenschaften nicht im Modell. Wenn Sie 2 Selbstreferenzen benötigen, benötigen Sie einen ähnlichen Code.

+0

Vielen Dank für die Antwort, die mein Problem gelöst hat! – mph