Fluent API一对一关系映射

时间:2015-06-24 10:19:09

标签: c# entity-framework ef-fluent-api

我正在尝试制作一对一的#34;使用Fluent API的关联。这是我的课程:

public class Person
{
    public Guid Id { get; set; }
    public Guid ProfilId { get; set; }

    public DateTime InsertDate { get; set; }
    public DateTime UpdateDate { get; set; }

    public virtual Profil Profil { get; set; }
}

public class Profil
{
    public Guid Id { get; set; }

    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public String Email { get; set; }

    public virtual Person Person { get; set; }
}

public class PersonMap : EntityTypeConfiguration<Person>  
{
    public PersonMap()
    {

        ...

        ToTable("Person");

        HasRequired(t => t.Profil)
              .WithOptional(c => c.Person)
              .Map(m => m.MapKey("ProfilId")); 
    }  
}

此实现抛出异常Invalid column name 'ProfilId'.

有人会告诉我如何使用这些类设置1-1关系的映射吗?

谢谢

1 个答案:

答案 0 :(得分:1)

配置一对一关系时,Entity Framework要求从属关键字的主键也是外键,因此您可以使用数据注释映射关系,如下所示:

public class Person
{
    [Key]
    [ForeignKey("Profil")]
    public Guid ProfilId { get; set; }

    public DateTime InsertDate { get; set; }
    public DateTime UpdateDate { get; set; }

    public virtual Profil Profil { get; set; }
}

或使用Fluent Api:

  HasKey(t=>t.ProfilId);
  HasRequired(t => t.Profil).WithOptional(c => c.Person);

编辑1:

嗯,EF允许您使用自己的PK在两个实体之间创建一对一的关系,但是您不能使用FK属性,因此,删除ProfileId实体中的Person和以这种方式配置关系:

HasRequired(t => t.Profil).WithOptional(c => c.Person);

MapKey方法用于更改数据库中的外键名称,但您的实体中不能具有同名的属性,否则将引发异常。