一对一关系实体框架外键映射

时间:2016-03-23 11:45:08

标签: c# entity-framework ado.net entity-framework-6

我正在分配两个对象之间的关系,但我在映射时遇到错误。

我有以下对象:

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

我收到以下错误:

  

财产的类型&#39; UserCode&#39;实体&#39; ManagerUser&#39;不匹配   财产的类型&#39; Id&#39;实体&#39;员工&#39;在参考   约束&#39; ManagerUser_StaffDetails&#39;

我一直在搜索并找不到解决办法让它将ManagerUser中的外键与UserCode中的Staff属性进行比较而不是ID属性。

1 个答案:

答案 0 :(得分: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");
        }
    }