代码优先循环 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<->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; }
}