2016-03-23 20 views
0

2つのオブジェクト間の関係を割り当てていますが、マッピングにエラーが発生しています。1対1の関係エンティティフレームワークの外部キーマッピング

私は次のオブジェクトがあります。

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"); 
    } 
} 

私は、次のエラーを取得しています:

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'

私は周りに検索し、外部キーを比較するためにそれを得るための解決策を見つけることができませんでしたIDプロパティの代わりにUserCodeプロパティのManagerUserStaffというプロパティがあります。

+0

あなたがManagerUserとスタッフの両方の主キーとしてユーザーコードを割り当てているとのSametimeで、あなたはUSERCODEを述べていることはスタッフのためのForeignKeyです... –

+0

あなたがすることはできませんEF6でそれを行う。 EF6は関係の「プリンシパル」のPKに対してのみFKを作成することができます。 –

答えて

0

あなたのキーは流暢な設定でちょっと混乱していますが、HasKeyはエンティティの主キーを設定します。以下では、主キーを両方のエンティティのIdに設定しました。そして、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

私のポストでコードを編集しました。 UserCodeはいずれのテーブルの主キーでもありません。 データベースでは、Staff.UserCodeがManagerUser.UserCodeにリンクされています。 私は何とかManagerUser.UserCodeをStaff.IDの代わりにStaff.UserCodeにリンクするように指示する必要があると思います。 –

+0

更新されたコードを試してください。あなたのDBが最新であることを確認してください。 –

関連する問題