我有两种模式:
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以使其理解我的结构?
答案 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 == someSite
和somePage.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