Я пытаюсь смоделировать коллекцию узлов графа с двумя классами. Один содержит свойства узла, а другой - отношения между узлами.
Код узла ниже:
[Table("Classes")]
public class Class
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public int CreditValue { get; set; }
public string LongName { get; set; }
public string ShortName { get; set; }
public bool IsCompleted { get; set; }
public virtual List<Prerequisite> Prerequisites { get; set; }
public virtual ICollection<PlanClass> PlanClasses { get; set; }
public virtual List<Prerequisite> RefPrerequisites { get; set; }
}
И отношения Prerequisite
класс:
[Key]
public Guid Id { get; set; }
public Guid ClassToId { get; set; }
[ForeignKey("ClassToId")]
public Class ClassTo { get; set; }
public Guid ClassFromId { get; set; }
[ForeignKey("ClassFromId")]
public Class ClassFrom { get; set; }
public bool IsSoft { get; set; }
public virtual List<Flag> OtherRequirements { get; set; }
Мой DbContext
выглядит так:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Class>().HasMany(e=>e.Prerequisites).WithOne();
modelBuilder.Entity<Class>().HasMany(e => e.RefPrerequisites).WithOne();
modelBuilder.Entity<Prerequisite>()
.HasOne(e => e.ClassFrom)
.WithMany(e => e.Prerequisites)
.HasForeignKey(e => e.ClassFromId);
modelBuilder.Entity<Prerequisite>()
.HasOne(e => e.ClassTo)
.WithMany(e => e.RefPrerequisites)
.HasForeignKey(e=>e.ClassToId).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<PlanClass>()
. HasKey(bc => new { bc.ClassId, bc.PlanId });
modelBuilder.Entity<PlanClass>()
.HasOne(bc => bc.Class)
.WithMany(b => b.PlanClasses)
.HasForeignKey(bc => bc.ClassId);
modelBuilder.Entity<PlanClass>()
.HasOne(bc => bc.Plan)
.WithMany(c => c.PlanClasses)
.HasForeignKey(bc => bc.PlanId);
}
Я попытался установить отношение «многие-многие», и, похоже, оно заполняется правильно, только ссылки на db.update (entity) становятся самообращающимися.
Prerequisite classExists = new Prerequisite
{
ClassToId = classToAdd.Id,
ClassFromId = classToCompare.Id,
EquivalentReqs = new List<Class>(),
IsSoft = false,
OtherRequirements = new List<Flag>()
};
classExists = db.Add(classExists).Entity;
db.SaveChanges();
prerequisites.Add(classExists);
...
classToAdd.Prerequisites = prerequisites;
db.Update(classToAdd); // This is where the prerequisites class is populated with the same object for class from and class to.
db.SaveChanges();
до дБ. SaveChanges ()
после db.SaveChanges ()