我试图解决一个多对多关系。在数据库级别上,一切对我来说都很好,但当我尝试获取数据(inlcude
(时,它失败了。
我得到:
Include内部使用的Lambda表达式无效。我调用/尝试的内容:
var readRecipes = db.MyClasses.
Include(blog => blog.SomeCollections).ThenInclude(post => post.Prop1).
Include(blog => blog.SomeCollections).ThenInclude(post => post.Prop2).
结构
主要类别:
public class MainClass{
// ...
public ICollection<NavigationProperty> NavigationPropertys;
// ...
public MainClass()
{
this.NavigationPropertys = new Collection<NavigationProperty>();
}
}
NavigationProperty:
public class NavigationProperty
{
public Guid ID { get; set; }
[Required]
public Guid? Prop1ID { get; set; }// 0,*
[Required]
public Guid? Prop2ID { get; set; }// 0,*
[Required]
public Guid MainClassID { get; set; }
[Required]
public Prop1 Prop1 { get; set; }
[Required]
public Prop2 Prop2 { get; set; }
public MainClass MainClass { get; set; }
[Required]
public float Amount { get; set; }
public NavigationProperty()
{
// todo: ?
}
}
我不知道,我做错了什么?
好的,我解决了我的问题。
代替:
public ICollection<NavigationProperty> NavigationPropertys;
我应该使用:
public ICollection<NavigationProperty> NavigationPropertys { get; set; };
这让Lambda崩溃了。
谢谢。
如果您也想包含导航属性的子级,您应该执行以下操作:
Parent.Include(p => p.Children.Select(c => c.GrandChild));
或者如果每个孩子有很多孙子女
Parent.Include(p => p.Children.SelectMany(c => c.GrandChildren));
或者如果每个父母只有一个孩子和一个孙子女。
Parent.Include(p => p.Child.GrandChild);
我希望这能有所帮助。
编辑:我没有意识到你的问题是关于ef核心的。我认为这是某种类型的伪代码或自制的扩展方法。
你读过微软提供的关于这个主题的所有例子吗?否则,我恐怕没有足够的信息来帮助你。
我需要了解的一件事是如何配置Prop1
和Navigation实体之间的关系。我看不出你的模型里有外键。当然,这不是必要的,这取决于您如何使用DbContext
中的modelBuilder
在重写的OnModelCreating
方法中配置关系,或者您如何使用属性来指示关系。关于ef核心中的关系和指定关系的更多信息,可以在这里找到。