在我的.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);
该项目包含大量数据,需要使用现有实体结构进行配置。请帮忙。
答案 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 属性来解决此问题。