如何首先制作两个自引用一对多关系代码
How to make two Self-referencing one to many relation Code first
我有以下问题,我有一个 "local" 实体,它有正本地和负本地(是的,这很奇怪,但确实如此),那么你如何在 Entity Framework Coder 上做到这一点首先,流利 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; }
}
好吧,你有了自己的实体,现在你只需要一个上下文,所以它看起来像这样:
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();
}
由于两个集合导航属性,按照惯例,EF 会将您的模型映射到具有隐式连接 table 的多对多关系。因此,要创建两个一对多关系,您需要使用以下流畅的配置:
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
完全没有记录。
第三,您需要关闭级联删除以避免多个级联路径问题。不需要像我一样为两种关系关闭它,但至少对于其中之一。在任何一种情况下,您都需要在删除 Local
记录之前手动执行一些操作(递归删除相关的 PositiveLocals
和 NegativeLocals
记录)。
我有以下问题,我有一个 "local" 实体,它有正本地和负本地(是的,这很奇怪,但确实如此),那么你如何在 Entity Framework Coder 上做到这一点首先,流利 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; }
}
好吧,你有了自己的实体,现在你只需要一个上下文,所以它看起来像这样:
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();
}
由于两个集合导航属性,按照惯例,EF 会将您的模型映射到具有隐式连接 table 的多对多关系。因此,要创建两个一对多关系,您需要使用以下流畅的配置:
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
完全没有记录。
第三,您需要关闭级联删除以避免多个级联路径问题。不需要像我一样为两种关系关闭它,但至少对于其中之一。在任何一种情况下,您都需要在删除 Local
记录之前手动执行一些操作(递归删除相关的 PositiveLocals
和 NegativeLocals
记录)。