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

时间:2015-05-05 19:18:24

标签: c# .net entity-framework entity-framework-6

我有两种模式:

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以使其理解我的结构?

2 个答案:

答案 0 :(得分:1)

  

Multiplicity constraint violated.

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

  

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

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

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

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

...如果你想确保Page及其.ParentPage.NestedPages都具有相同的ContainingSite和一个{{}},那么保持一致性会很困难{1}}及其Site相等,等等。

顺便说一句,如果您尝试在数据库中创建某种树结构,那么this (starting from page 49)可能有用吗?

答案 1 :(得分:0)

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