Code First循环0..1映射?

时间:2014-11-26 10:47:04

标签: c# entity-framework ef-code-first

我有这个模型,基于Code First和现有的DB:

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);

我如何映射,以便Parent1导航属性映射到Parent1Id,Parent2映射到Parent2Id?

2 个答案:

答案 0 :(得分:0)

不,这不是设置映射的正确方法。要设置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让实体框架自行解决,但请参见下文。

  

我如何映射,以便Parent1导航属性映射到Parent1Id,Parent2映射到Parent2Id?

如果实体框架没有根据您用于您的媒体资源的名称自动检测到这一点(我不确定何时可以,何时无法弄清楚),您可以使用{{ 1}}功能:

HasForeignKey

this.HasOptional(t => t.Parent1).WithMany().HasForeignKey(t => t.Parent1Id); this.HasOptional(t => t.Parent2).WithMany().HasForeignKey(t => t.Parent2Id); 只能在HasForeignKey()的结果上调用,因此如果您需要指定外键属性,则不能省略WithMany()

答案 1 :(得分:0)

使用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; }
}