【发布时间】:2018-09-10 22:28:43
【问题描述】:
在我的 .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 Core 不适用于 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);
本项目数据较多,需要使用现有的实体结构进行配置。请帮忙。
【问题讨论】:
-
你检查过entityframeworktutorial.net/efcore/…吗?对于一对零或一对关系,您需要在两侧引用导航属性并遵循命名约定。
-
我错过了 Person 类中的一个属性,我现在对其进行了编辑。我检查了链接,但在那里,依赖实体(在本例中为地址)定义了自己的主键。在我的域中,依赖实体只有外键,它也是它的主键。
-
在地址中添加一个字段
public int AdressId { get; set; }作为主键并将PID重命名为PersonId会更简单。这样,您既不需要流利的 api 也不需要数据注释 -
正如我的问题中所解释的,此时添加新的身份字段不是一种选择,因为表格已填充。
-
我了解您希望使用和保留数据库中的数据。您是否可以选择创建链接表,以便通过单独的表将每个地址链接到每个人?
标签: c# entity-framework .net-core ef-core-2.1