EF 6 实体中的循环和外部引用

Circular and external references in EF 6 entities

我有两个模型:

class Site {
  public virtual string Name { get; set; }
  public virtual Page RootPage { get; set; }
}

class Page {
  public virtual string Name { get; set; }
  public virtual string Content { get; set; }
  public virtual Site ContainingSite { get; set; }
  public virtual Page ParentPage { get; set; }
  public virtual ICollection<Page> NestedPages { get; set; }
}

页面可以嵌套,但它们都必须绑定到一个站点。但是,任何站点只能有一个根页面。

配置如下:

modelBuilder.Entity<Site>().HasRequired(x => x.RootPage).WithRequiredPrincipal(x => x.ContainingSite);
modelBuilder.Entity<Page>().HasMany(x => x.NestedPages).WithOptional(x => x.ParentPage);

我在插入数据时一直收到此错误:

Multiplicity constraint violated. The role 'Site_RootPage_Target' of the relationship 'MySite.DataModel.Site_RootPage' has multiplicity 1 or 0..1.

如何配置 EF 以使其理解我的结构?

我会从 Page 中删除 "Site ContainingSite" 行, 并仅使用页面的 ParentPage 导航到包含站点。 例如this.RootPage.ContainSite

Multiplicity constraint violated.

您收到此错误是因为您可能试图创建具有相同 ContainingSite 的多个 Page 实体,但

modelBuilder.Entity<Site>() .HasRequired(x => x.RootPage) .WithRequiredPrincipal(x => x.ContainingSite);

creates a one-to-one 关系,其中 someSite.RootPage.ContainingSite == someSitesomePage.ContainingSite.RootPage == somePage.


拥有三种不同的关系可能更有意义:

  • 每个Site都有一个根Page
  • 每个 Page 都是包含 Site 的一部分(或者每个 Site 有很多 Page
  • 每个 Page 有许多嵌套的 Pages

...尽管如果您想确保 Page 及其 .ParentPage.NestedPages 都具有相同的 ContainingSite,则保持一致性可能很困难,并且a Site 和它的 .RootPage.ContainingSite 相等,等等


顺便说一句,如果您想在数据库中创建某种树结构,也许 this (starting from page 49) 会有所帮助?