Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF 6实体中的循环和外部引用_C#_.net_Entity Framework_Entity Framework 6 - Fatal编程技术网

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.