【问题标题】:Entity Framework Core Configuration one to zero or one relationship with same primary key实体框架核心配置一对零或具有相同主键的一对关系
【发布时间】: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


【解决方案1】:

您的第一次尝试很接近,您只需要使用 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 属性来解决这个问题。

【讨论】:

  • 如果我们想创建一对零或者没有流利的api怎么办
猜你喜欢
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2018-09-24
  • 1970-01-01
相关资源
最近更新 更多