2016-03-23 3 views
0

Ich arbeite an der Zuordnung einer Beziehung zwischen zwei Objekten, aber ich erhalte einen Fehler beim Mapping.Eins-zu-Eins-Beziehung Entity Framework-Fremdschlüsselzuordnung

Ich habe die folgenden Objekte:

public abstract class EntityBase : IEntity 
{ 
    public int Id { get; set; } 
} 

public class ManagerUser : EntityBase 
{ 
    public string UserCode { get; set; } 
    public string Title { get; set; } 
    public virtual Staff StaffDetails { get; set; } 
} 

public class Staff : EntityBase 
{ 
    public string UserCode { get; set; } 
    public string DOB { get; set; } 
} 

public class ManagerUserMap : EntityMapBase<ManagerUser> 
{ 
    protected override void SetupMappings() 
    { 
     base.SetupMappings(); 
     //this.HasKey(t => t.UserCode); 
     this.ToTable("ManagerUsers"); 
     this.Property(t => t.Id).HasColumnName("ManagerUsersID") 
     .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); 
     this.Property(t => t.Title).HasColumnName("txtTitle"); 
     this.HasRequired(x => x.StaffDetails) 
      .WithMany() 
      .HasForeignKey(x => x.UserCode); 
    } 
} 

public class StaffMap : EntityMapBase<Staff> 
{ 
    protected override void SetupMappings() 
    { 
     base.SetupMappings(); 
     //this.HasKey(t => t.UserCode); 
     this.ToTable("TblStaff"); 
     this.Property(t => t.Id).HasColumnName("StaffID") 
     .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); 
     this.Property(t => t.UserCode).HasColumnName("User_Code"); 
     this.Property(t => t.DateOfBirth).HasColumnName("dob"); 
    } 
} 

ich die folgende Störung erhalte:

The type of property 'UserCode' on entity 'ManagerUser' does not match the type of property 'Id' on entity 'Staff' in the referential constraint 'ManagerUser_StaffDetails'

ich um gesucht haben und gescheitert, eine Lösung zu finden, um den Fremdschlüssel zu vergleichen zu bekommen in ManagerUser mit der UserCode Eigenschaft in Staff anstelle der ID Eigenschaft.

+0

Sie Usercode als Primärschlüssel zuweisen für beide ManagerUser und Mitarbeiter und am sametime, haben Sie die Usercode Angabe ist ein foreignkey für das Personal ... –

+0

Sie können nicht Mach das in EF6. EF6 kann FK nur für den PK des "Principals" der Beziehung erstellen. –

Antwort

0

Ihre Schlüssel sind in der fließenden Konfiguration etwas durcheinander, HasKey setzt den Primärschlüssel für die Entität. Im Folgenden habe ich den Primärschlüssel als Id für beide Entitäten festgelegt. Dann die Usercode verwenden als FK:

public class ManagerUserMap : EntityMapBase<ManagerUser> 
    { 
     protected override void SetupMappings() 
     { 
      base.SetupMappings(); 
      this.HasKey(t => t.Id); 
      this.ToTable("ManagerUsers"); 
      this.Property(t => t.Id).HasColumnName("ManagerUsersID") 
      .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); 
      this.Property(t => t.Title).HasColumnName("txtTitle"); 
      this.HasRequired(x => x.StaffDetails) 
       .WithMany() 
       .HasForeignKey(x => x.UserCode); 
     } 
    } 

    public class StaffMap : EntityMapBase<Staff> 
    { 
     protected override void SetupMappings() 
     { 
      base.SetupMappings(); 
      this.HasKey(t => t.Id); 
      this.ToTable("TblStaff"); 
      this.Property(t => t.Id).HasColumnName("StaffID") 
      .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); 
      this.Property(t => t.UserCode).HasColumnName("User_Code"); 
      this.Property(t => t.DateOfBirth).HasColumnName("dob"); 
     } 
    } 
+0

Ich habe den Code in meinem Beitrag bearbeitet. UserCode ist nicht der Primärschlüssel für eine der beiden Tabellen. In der Datenbank ist Staff.UserCode mit ManagerUser.UserCode verknüpft. Ich denke, ich muss es irgendwie sagen, um ManagerUser.UserCode mit Staff.UserCode statt ManagerUser.UserCode mit Staff.ID zu verknüpfen. –

+0

Versuchen Sie den aktualisierten Code. Stellen Sie sicher, dass Ihre Datenbank auf dem neuesten Stand ist. –