C# EF 6实体中的循环和外部引用
我有两种型号:C# EF 6实体中的循环和外部引用,c#,.net,entity-framework,entity-framework-6,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
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; }
}
如何配置EF以使其理解我的结构?我将从页面中删除“Site ContainingSite”行,
只需使用页面的父页面即可导航到包含该页面的站点。
e、 g.this.RootPage.ContainSite
违反了多重性约束。
出现此错误是因为您可能试图使用相同的容器站点创建多个页面
实体,但是
modelBuilder.Entity()
.HasRequired(x=>x.RootPage)
.具有所需的主体(x=>x.包含站点)代码>
一种关系,其中someSite.RootPage.ContainingSite==someSite
和somePage.ContainingSite.RootPage==somePage
有三种不同的关系可能更有意义:
- 每个
站点
都有一个根页面
- 每个
页面
都是包含站点
的一部分(或者每个站点
都有许多页面
s)
- 每个
页面
都有许多嵌套的页面
…但是,如果要确保页面及其。父页面和。嵌套页面都具有相同的包含站点
,并且站点
及其根页面.包含站点
相等,则维护一致性可能很困难
另外,如果您试图在数据库中创建某种树结构,可能会有所帮助?您的父页面应该是页面,而不是站点,对吗?另外,RootPage
和ContainingSite
不应该是不同关系的一部分吗?一个站点
似乎只有一个根页面
,但许多页面
可能与一个站点
关联。如果您想确保someSite.RootPage.ContainingSite==someSite
,那么我认为您可能需要使用验证。@jjj,是的,很抱歉输入错误。您是对的,站点
有一个根页面
,但许多页面
都绑定到一个站点。您能告诉我有关验证的更多信息吗?验证:ContainingSite
属性旨在作为一种快捷方式,在不向上遍历树的情况下获取任何页面的站点。因此EF不支持只存储对任意实体的引用,而不具有适当的关系?如果假定有许多页面
具有相同的包含站点
,那么您就不能使用已有的关系。除了第三个关系之外,您还需要类似于modelBuilder.Entity().HasRequired(s=>s.ContainingSite).WithMany()
,然后与modelBuilder.Entity().HasRequired(x=>x.RootPage.)建立单独的关系。不过,关键的情况会很有趣,保持一致性也会很有趣……好吧,无论如何,我听从了你的建议,用演示文稿中基于路径的实现替换了朴素的树实现。修复了当前的问题,使加载子树变得更加容易。谢谢
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.