Я пытаюсь сначала сделать ссылку на себя, используя код EF4.1. Моя сущность выглядит так
public class Site
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Sitename { get; set; }
public virtual Site ChildSite { get; set; }
public virtual ICollection<Site> ChildSites { get; set; }
}
И в моем контексте класса я делаю это, чтобы сделать ссылку на себя
modelBuilder.Entity<Site>()
.HasOptional(s => s.ChildSite)
.WithMany(s => s.ChildSites)
.HasForeignKey(s => s.ParentId);
Но когда я пытаюсь добавить фиктивные данные в свою базу данных с этим кодом
var sites = new List<Site>
{
new Site { ParentId = 0, Sitename = "Top 1" },
new Site { ParentId = 0, Sitename = "Top 2" },
new Site { ParentId = 0, Sitename = "Top 3" },
new Site { ParentId = 0, Sitename = "Top 4" },
new Site { ParentId = 1, Sitename = "Sub 1_5" },
new Site { ParentId = 1, Sitename = "Sub 1_6" },
new Site { ParentId = 1, Sitename = "Sub 1_7" },
new Site { ParentId = 1, Sitename = "Sub 1_8" },
new Site { ParentId = 2, Sitename = "Sub 2_9" },
new Site { ParentId = 2, Sitename = "Sub 2_10" },
new Site { ParentId = 2, Sitename = "Sub 2_11" },
new Site { ParentId = 2, Sitename = "Sub 2_12" },
new Site { ParentId = 3, Sitename = "Sub 3_13" },
new Site { ParentId = 3, Sitename = "Sub 3_14" },
new Site { ParentId = 3, Sitename = "Sub 3_15" },
new Site { ParentId = 3, Sitename = "Sub 3_16" },
new Site { ParentId = 4, Sitename = "Sub 4_17" },
new Site { ParentId = 4, Sitename = "Sub 4_18" },
new Site { ParentId = 4, Sitename = "Sub 4_19" },
new Site { ParentId = 4, Sitename = "Sub 4_20" }
};
sites.ForEach(s => context.Sites.Add(s));
context.SaveChanges();
Я получаю эту ошибку:
Невозможно определить основной конец
Отношение Cms.Model.Site_ChildSite. Несколько добавленных объектов могут
имеют одинаковый первичный ключ.
Что мне здесь не хватает?
Редактировать:
Вот решение моей проблемы. Я удалил public virtual Site ChildSite { get; set; }
из сущности
public class Site
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Sitename { get; set; }
public virtual ICollection<Site> ChildSites { get; set; }
}
Затем я изменил modelBuilder
на этот
modelBuilder.Entity<Site>()
.HasMany(s => s.ChildSites)
.WithOptional()
.HasForeignKey(s => s.ParentId);
Поскольку создается впечатление, что автоматическое создание базы данных не работает, я пошел дальше и сам создал таблицу, как эта
int Id, not null, primary key
int ParentId, null
string Sitename, null
И все работает так, как я хочу.
2-е редактирование
И последний шаг для автоматической генерации фиктивных данных.
var parent1 = new Site
{
Sitename = "Top 1",
ChildSites = new List<Site>
{
new Site {Sitename = "Sub 1_5"},
new Site {Sitename = "Sub 1_6"},
new Site {Sitename = "Sub 1_7"},
new Site {Sitename = "Sub 1_8"}
}
};
ect . . .
context.Sites.Add(parent1);
context.SaveChanges();
См. Ответ Слаумы ниже