代码优先循环 0.1 映射

本文关键字:映射 循环 代码 | 更新日期: 2023-09-27 18:32:15

我有这个模型,并且基于现有数据库的代码优先:

public class Customer
{
    public int Id {get; set;}
    public int Parent1Id {get; set;}
    public int Parent2Id {get; set;}
    public Customer Parent1 {get; set;}
    public Customer Parent2 {get; set;}
}

这是设置映射的正确方法吗?

this.HasOptional(t => t.Parent1)
    .WithOptionalPrincipal(d => d.Parent1);
this.HasOptional(t => t.Parent2)
    .WithOptionalPrincipal(d => d.Parent2);

如何映射,以便父级 1 导航属性映射到父级 1Id,父级 2 映射到父级 2Id?

代码优先循环 0.1 映射

不,这不是设置映射的正确方法。要设置 0..1<->n 关系,请使用 WithMany()HasOptional(...).WithOptional*(...) 适用于 0..1<->0..1 映射。

this.HasOptional(t => t.Parent1).WithMany(); // no inverse navigation property
this.HasOptional(t => t.Parent2).WithMany();

如果添加导航属性以获取父项的子项,则应按如下所示指定它:

this.HasOptional(t => t.Parent1).WithMany(t => t.Children1); // Children1 is the inverse navigation property of Parent1
this.HasOptional(t => t.Parent2).WithMany(t => t.Children2);

您也可以省略WithMany让实体框架自行解决,但请参阅下文。

如何映射,以便父级 1 导航属性映射到父级 1Id,父级 2 映射到父级 2Id?

如果实体框架没有根据您用于属性的名称自动检测到这一点(我不确定它何时可以以及何时无法弄清楚),则可以使用 HasForeignKey 函数:

this.HasOptional(t => t.Parent1).WithMany().HasForeignKey(t => t.Parent1Id);
this.HasOptional(t => t.Parent2).WithMany().HasForeignKey(t => t.Parent2Id);

HasForeignKey()只能在WithMany()的结果上调用,所以如果需要指定外键属性,不能省略WithMany()

有两种方法可以使用Fluent DataAnotacion和Api进行映射。查看 DataAnotacion 的示例

public class Order
{
   [Key]
   public int Id { get; set; }
   public virtual ICollection<OrderOrganisation> OrderOrganisations { get; set; }
}
public class Organisation
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<OrderOrganisation> OrderOrganisations { get; set; }
}
public class OrderOrganisation
{
    [ForeignKey("Order"), Column(Order = 0)]
    public int? OrderId { get; set; }
    [ForeignKey("Organisation"), Column(Order = 1)]
    public int? OrganisationId { get; set; }
   [ForeignKey("OrderId")]
   public virtual Order Order { get; set; }
   [ForeignKey("OrganisationId")]
   public virtual Organisation Organisation { get; set; }
}