在 Abp.io 中实现一对一关系的方式是使用 Navigation 属性。但是,在一对一关系中,Child 表必须引用 Parent 表的主键。下面是一个示例:
定义两个实体类:
public class Person : Entity
{
public string Name { get; set; }
public string Email { get; set; }
public int AddressId { get; set; }
public virtual Address Address { get; set; }
}
public class Address : Entity
{
public string Street { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
public virtual Person Person { get; set; }
}
在 DbContext 中指定关系:
public class MyDbContext : AbpDbContext
{
public DbSet Persons { get; set; }
public DbSet Addresses { get; set; }
public MyDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasOne(p => p.Address)
.WithOne(a => a.Person)
.HasForeignKey(a => a.PersonId);
}
}
在上面的代码中,HasOne 表示 Person 实体拥有一个(one) Address,WithOne 表示 Address 只能属于一个(one) Person。HasForeignKey 表示将 Address 表的 PersonId 列作为引用 Person 表的主键(默认是 Id 列)。
注意:对于一对一关系,通常使用 Entity Framework Core 的属性映射(Fluent API)来指定 Navigation 属性的名称和框架不得不提供的约定不同。本示例中,Person 实体中的 Navigation 属性名称为 Address,而 Address 实体中的 Navigation 属性名称为 Person。