实体框架核心配置一对一或具有相同主键的一种关系

时间:2018-09-10 13:35:17

标签: c# entity-framework .net-core ef-core-2.1

在我的.NET MVC项目中,我的域类具有一对一或零关系,如:

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

    public string FullName { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Address { get; set; }
    public string City { get; set; }

    public virtual Person Person { get; set; }
    [Key, ForeignKey("Person")]
    public int PID { get; set; }
}

这使用EF 6.x,并且地址实体使用PID(外键)作为其标识列。该代码是在EF 6.x中自动配置的,无需任何显式配置。

现在,我正在将此解决方案移植到.NET Core 2.1。此处,EF核心不适用于EF 6.x的数据注释。例如,我无法获取属性person.Address.City,看来我需要使用FluentAPI对其进行手动配置。

到目前为止,我已经尝试了三种不同的配置,一个接一个地无济于事:

//First config
       modelBuilder.Entity<Person>()
            .HasOne(p => p.Address)
            .WithOne(a => a.Person);

//Second config
        modelBuilder.Entity<Person>()
            .OwnsOne(p => p.Address);

//Third config
        modelBuilder.Entity<Person>()
            .OwnsOne(p => p.Address)
            .OwnsOne(a=>a.Person);

该项目包含大量数据,需要使用现有实体结构进行配置。请帮忙。

1 个答案:

答案 0 :(得分:2)

您的第一次尝试已结束,您只需使用 HasForeignKey 方法指定哪个字段是关系的外键:

modelBuilder.Entity<Person>()
    .HasOne(p => p.Address)
    .WithOne(a => a.Person)
    .HasForeignKey<Address>(a => a.PID);

出于完整性考虑:

public class Address
{
    [Column("Address")]
    public string Addr { get; set; }
    public string City { get; set; }

    public virtual Person Person { get; set; }
    [Key]
    public int PID { get; set; }
}

您已不再需要 PID 属性上的 ForeignKey 属性,因为该关系的配置很流畅。此外,您的代码还会产生编译器错误,因为类不能具有相同名称的成员。因此,我添加了 Column 属性来解决此问题。