- 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/
我们正在创建一个 REST API,我们目前有两种定义资源的方法。 基本上我们有 Patients , Studies和 Images哪里Patient有 n Studies和一个 Study有 n
我想知道哪一种更好的方法来实现一个被设计为具有复杂 subview 层次结构的 View ,比如说一个 View ,左侧有一个 subview ,右侧有一个 subview ,左侧 subview 有
启动布局检查器时收到错误消息:“获取 View 层次结构时出错:意外错误:空 View 层次结构”。 同样在 Logcat 中有一个异常(exception): 12-10 23:46:56.812
我一直在寻找要在我工作的公司的Web开发部门中实施的Web开发人员指定层次结构。 例如:关联Web开发人员-> Web开发人员->高级Web开发人员->接下来做什么? 请建议..! 最佳答案 “Web
我明白那个: 更快 访问时间> 更多 昂贵的 较慢 访问时间> 减 昂贵的 我也明白寄存器是层次结构的顶部,并且具有最快的访问时间。我很难研究的是为什么它这么贵?据我所知,寄存器实际上是直接内置在 A
我希望有人经历过相同的过程并可以帮助我看看以下情况是否可能。 我目前构建了一个从 S3 存储桶进行复制的管道。该存储桶包含大量文件夹。 Azure 数据工厂是否有办法在从 S3 存储桶复制数据时忽略文
在我看来,定义 static namedQueries = {} 在层次结构的子类中完全屏蔽了父类(super class)的 namedQueries 声明。有没有办法让两者都工作?说使用 supe
我希望有人经历过相同的过程并可以帮助我看看以下情况是否可能。 我目前构建了一个从 S3 存储桶进行复制的管道。该存储桶包含大量文件夹。 Azure 数据工厂是否有办法在从 S3 存储桶复制数据时忽略文
我遇到了以下嵌套数组,并且对它为什么使用这种特定语法有点困惑: var allQuestions = [{ question: "Which company first implemented
在过去的一个月里,我一直在构建一个 Drupal 8 站点,它应该有一个类似于这样的愚蠢的简单页面层次结构: Parent Page --Child Page --Child Page ----Gra
我正在寻求理解 Delphi 7 中其他人的代码(我怀疑较新的版本内置了此代码,但我不想为最新版本花费 > 1000 美元)。 他们有(最好是FOSS)工具可以帮助我生成类层次结构图吗? 其实就是G
我目前有这两个实体:名义上的和熟悉的(家庭/亲属/亲戚)。 熟悉的 [0..*][1] 标题 这两个类具有一个人的共同属性(名字,姓氏,出生日期......),并且它们是两种附属 我想将它们统一在一个
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
是否可以通过层次结构 id 对层次结构中的 sql 数据进行排序,然后对于每个级别排序它按字母顺序说? 假设我们有一个员工表,它根据员工 ID 列出组织层次结构 你有鲍勃 (5),菲尔 (17) 和查
public class OrderEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Colu
我想知道如何编写 postgres 子查询,以便下表示例输出我需要的内容。 id parent_id postdate 1 -1 2015-03-10 2 1
我正在建立一个分类网站。你能建议我怎么做吗基于国家/地区的分区地理位置表 ??? 更新:我可以根据纬度和经度做吗? 下面是我的表结构。 CREATE TABLE IF NOT EXISTS `geo`
我正在使用 Android SDK 附带的 Hierarchy Viewer 工具进行一些测试。 我正在测试的 Activity 具有以下 xml: Sl
我已经对此进行了研究,并且知道我不是第一个提出问题的人,但我似乎无法理解它。我创建了一个简单的示例,如果有人可以提供缺失的链接,我认为它可以帮助我破解它! 我有一个区域表,其中包含层次结构中的大陆和国
我在第一个真正的 iPhone 应用程序上遇到了一些困难,想获得一些关于如何构建它的建议。我正在寻找一些关于创建 UI 组件并将它们链接在一起以创建应用程序流(以编程方式创建 View / Contr
我是一名优秀的程序员,十分优秀!