如何使两个自引用一对多关系代码优先

时间:2017-12-20 15:58:16

标签: c# .net entity-framework ef-fluent-api

我有以下问题,我有一个“本地”实体,有正面的本地和负面的本地人(是的,它很奇怪,但它是),那么你怎么能在Entity Framework Coder上做到这一点,Fluent Api我离开你了一张图片来更好地解释我

model diagram

 public class Local
{

    public int Id { get; set; }

    public string Number { get; set; }

    public virtual ICollection<Local> PositiveLocals { get; set; }

    public virtual ICollection<Local> NegativeLocals { get; set; }
}

2 个答案:

答案 0 :(得分:1)

由于两个集合导航属性,按照惯例,EF会将模型映射到隐式联结表的多对多关系。因此,要创建两个一对多关系,您需要使用以下流畅配置:

modelBuilder.Entity<Local>()
    .HasMany(e => e.PositiveLocals)
    .WithOptional()
    .Map(m => m.MapKey("positive_local_id"))
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Local>()
    .HasMany(e => e.NegativeLocals)
    .WithOptional()
    .Map(m => m.MapKey("negative_negative_id"))
    .WillCascadeOnDelete(false);

有些注意事项:

首先,由于您的模型没有反向引用导航属性,因此您必须使用HasOptional / HasRequired的无参数重载。

其次,在这种特殊情况下,您需要建立关系可选(使用HasOptional),否则您根本无法创建Local记录。

第三,您需要关闭级联删除以避免多个级联路径问题。它不需要像我一样关闭两个关系,但至少对于其中一个关系。在任何一种情况下,您都需要在删除PositiveLocals记录之前手动执行某些操作(递归删除相关的NegativeLocalsLocal记录)。

答案 1 :(得分:0)

嗯,你有你的实体,现在你需要的只是一个上下文,所以它看起来像这样:

using System.Data.Entity;

public class Context : DbContext
{
    public DbSet<Local> Locals { get; set; }

    public Context() : base("ConnectionStringKeyName") { }
}

然后你会像这样使用它:

var positive = new Local
{
    Id = 1,
    Number = "One"
};

var negative = new Local
{
    Id = -1,
    Number = "Minus One"
};

negative.PositiveLocals.Add(positive);
positive.NegativeLocals.Add(negative);

using (var context = new Context())
{
    context.Locals.Add(positive);
    context.Locals.Add(negative);
    context.SaveChanges();
}
相关问题