- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 ASP.Net Core 中为网站构建菜单系统。假设我有几个数据库表,一个用于 Pages
和一个 Articles
,尽管真正重要的是它们是不同的实体。他们每个人都有一个 Name
和 Permalink
属性(property)。
在我也想存储在数据库中的菜单中,我想引用 Name
和 Permalink
每个实体的。我设计了一个简单的菜单类/模型结构如下:
抽象菜单项
public abstract class MenuItem
{
[Key]
public int MenuItemId { get; set; }
public int MenuPosition { get; set; }
public abstract string Name { get; }
public abstract string Permalink { get; }
}
具体的 ArticleMenuItem
public class ArticleMenuItem : MenuItem
{
public ArticleMenuItem() {}
public ArticleMenuItem(Article article)
{
Article = article;
}
public string Name => Article.Name;
public string Permalink => Article.Permalink;
[Required]
public int ArticleId { get; set; }
[ForeignKey("ArticleId")]
public Article Article { get; set; }
}
具体的 PageMenuItem
public class PageMenuItem : MenuItem
{
public PageMenuItem() {}
public PageMenuItem(Page page)
{
Page = page;
}
public string Name => Page.Name;
public string Permalink => Page.Permalink;
[Required]
public int PageId { get; set; }
[ForeignKey("PageId")]
public Page Page{ get; set; }
}
然后我覆盖 onModelCreating(ModelBuilder modelBuilder)
对于相关的 DbContext
因为我不想让个人DbSet<T>'s
可用:
modelBuilder.Entity<PageMenuItem>();
modelBuilder.Entity<ArticleMenuItem>();
以及添加相关的DbSet<T>
菜单:
public virtual DbSet<MenuItem> MenuItems { get; set; }
在应用加载时向数据库添加一些示例记录(假设我也初始化了一些文章和页面):
List<MenuItem> items = new List<MenuItem>()
{
new PageMenuItem(pages[0]) { MenuPosition = 1 },
new ArticleMenuItem(articles[0]) { MenuPosition = 2 }
};
items.ForEach(item => context.MenuItems.Add(item));
从数据库中获取菜单项的简单存储方法:
public IEnumerable<MenuItem> GetAllMenuItems() => _context.MenuItems;
有了这一切,我希望我能得到 Name
和 Permalink
对于每个项目如下(例如,在 View 中):
@foreach (MenuItem item in Model)
{
<a href="@item.Permalink">@item.Name</a>
}
遗憾的是,这会导致 null object exception
,然后我想起 EF Core 不支持延迟加载。因此,当我在存储库中获取菜单项时,我想急切地加载影子属性,特别是相关实体。
有two approaches访问影子属性。我更新存储库方法的第一种方法如下所示:
public IEnumerable<MenuItem> GetAllMenuItems() => _context.MenuItems
.Include(item => context.Entry(item).Property("Page").CurrentValue)
.Include(item => context.Entry(item).Property("Article").CurrentValue)
这导致:
InvalidCastException: Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpression1' to type 'System.Linq.Expressions.MemberExpression'.
转换为 (Page)
和 (Aticle)
分别导致:
InvalidOperationException: The property expression 'item => Convert(value(InfoSecipediaWeb.Infrastructure.EntityFramework.ApplicationDbContext).Entry(item).Property("Page").CurrentValue)' is not valid. The expression should represent a property access: 't => t.MyProperty'.
访问影子属性的第二种方法似乎只能访问单个属性值:
public static TProperty Property<TProperty>([NotNullAttribute] object entity, [NotNullAttribute][NotParameterized] string propertyName);
但是,试一试:
public IEnumerable<MenuItem> GetAllMenuItems() => _context.MenuItems
.Include(item => EF.Property<Page>(item, "Page"))
.Include(item => EF.Property<Article>(item, "Article"));
结果:
InvalidOperationException: The property expression 'item => Property(item, "Page")' is not valid. The expression should represent a property access: 't => t.MyProperty'.
我想知道是否可以在继承模型中使用阴影属性进行导航?如果是这样,我如何包含相关实体以便在我的具体 MenuItem
中可以访问它类?例如对于 public string Name => Page.Name
.
最佳答案
不幸的是,目前没有预先加载派生类属性的语法(请注意,它们与影子属性不同)。这与延迟加载的缺乏一起使得显式加载成为唯一的选择。参见例如 ef-core load collection property of nested tph inherited member如何将它用于单个项目,用于项目集合恐怕你必须将结果具体化到列表中,然后使用具体类型的显式加载并依赖 EF 导航属性修复。
对于您的示例,它可能是这样的:
public IEnumerable<MenuItem> GetAllMenuItems()
{
var menuItems = _context.MenuItems.ToList();
_context.MenuItems.OfType<ArticleMenuItem>().Include(e => e.Article).Load();
_context.MenuItems.OfType<PageMenuItem>().Include(e => e.Page).Load();
return menuItems;
}
另一种解决方法(我只说了一个)是使用手动联合查询,这基本上扼杀了 TPH 的想法:
public IEnumerable<MenuItem> GetAllMenuItems() =>
_context.MenuItems.OfType<ArticleMenuItem>().Include(e => e.Article)
.AsEnumerable() // to avoid runtime exception (EF Core bug)
.Concat<MenuItem>(
_context.MenuItems.OfType<PageMenuItem>().Include(e => e.Page));
关于c# - 使用 Table-Per-Hierarchy 继承模型访问相关实体的影子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41703957/
我是一名初学者,正在学习 python (+pandas),希望我能很好地解释这一点。我有一个超过 300 万行的大型时间序列 pd 数据框,最初有 12 列跨越多年。这涵盖了从不同地点取票的人,这些
我们目前正在审查我们的 WCF 服务设计,困扰我的一件事是在 Per-Call 和 Per-Session 服务之间做出决定。我相信我了解两者背后的概念,但我并没有真正看到按调用服务的优势。我知道使用
这几天我在 Web 应用程序中从头开始构建一个新应用程序。 (技术是 Asp.Net,我使用的 ORM 是 Entity Framework。如果重要的话) 我不确定广泛使用的模式 session p
嗨,我收到以下错误,导致构建失败,但在 bin 中创建了 Wix 安装程序 MSI。我怎样才能避免这些错误或抑制? 错误 LGHT0204:ICE57:组件 'cmp52CD5A4CB5D668097
错误“错误 LGHT0204:ICE57:组件“XXX”同时具有每用户数据和可以是每用户或每台机器的 key 路径”是什么意思? 是否可以修复此错误? 无论如何,Wix 都会创建 msi 文件,并且可
我正在使用 NodeJS 和 amqplib构建一个简单的作业队列库(有点类似于 Jackrabbit) 用于服务,该服务应该解析包含有关许多不同事件的信息的相当大的提要。 信息被解析后,它被分发到数
我有一个 subversion 存储库,其中包含多个子文件夹,对应于构成我的项目的各种应用程序、配置文件、DLL 等(我将它们称为“模块”)。现在我们开始“分支”成几个相关的项目。也就是说,每个高级项
Google PageRank 是按整个网站(域)的一个值计算还是按每个网页计算? 最佳答案 Google 在多大程度上遵循众所周知的 PageRank 算法是他们的商业 secret 。在通用算法中
我正在构建一个网络爬虫,它有两个主要功能,它们都作为线程执行:- getter (抓取网站并将文件中的单独链接存储到数据库中)。- 下载器(根据 fetcher 返回的 url 下载文件)。 我有一个
我有一个运行 web 应用程序的 tomcat 服务器。在 webapp 的启动过程中,我使用为 interface ServletContextListener 实现的类设置了一些上下文参数。我在这
我正在建立一个系统,我希望每天为每个用户(1000+)添加一组值。 假设:我可以在这个系统中记录 Alice 和 Bob 何时醒来以及他们在 2019 年 8 月 1 日或 2024 年晚餐吃了什么。
我有一个包含选票的数据库。这些投票记录包括:“时间戳;分数” 分数是一个整数。 我想创建一个热图,所以我想要一个数据框,其中包含每个工作日每个小时的值以及该时间范围内所有分数的平均分。 如果该工作日的
我注意到您可以为 Opsworks 堆栈中的每个层创建 EBS 卷。 我的问题 :EBS 卷是在层的实例之间共享,还是每个实例都有自己的 EBS? (那么,是创建了一个 EBS,还是创建了多个?) 为
我们都知道我们应该将我们的 CSS 合并到一个文件中,但是是按站点还是按页面?我发现了两者的优缺点。 场景如下: 大型网站 CSS 文件分解为一个文件用于全局样式,多个文件用于模块 解决方案 A:将整
我有一组销售报告,其中包含报告“每天”或“每月”销售数据的商店。当我将它们绘制在同一张图表上时,“每月”数字看起来像尖峰,使图表难以理解。 我希望将那些“每月一次”的数字转换为在一个月中的几天内平均分
Google Drive API 有一个名为Queries per 100 seconds *per user* 的配额 - 但用户到底是什么?是根据 OAuth 2.0 客户端 ID 还是根据源 I
我知道 ServiceStack 提供了一个 RequiredRole 属性来控制权限,但是,这并不完全适用于我的用例。我有一个包含大量用户生成内容的网站。用户只能编辑他们有明确权限的文档。权限是按对
我有一个以下形式的数据框,其中每一行对应于机器上运行的一个作业: import pandas as pd df = pd.DataFrame({ 'MachineID': [4, 3, 2,
我有一个以下形式的数据框,其中每一行对应于机器上运行的一个作业: import pandas as pd df = pd.DataFrame({ 'MachineID': [4, 3, 2,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我是一名优秀的程序员,十分优秀!