c# - EF Core:找不到实体类型属性的支持字段,并且该属性没有 getter
问题描述
我在 EF Core 中遇到以下错误:找不到实体类型“Child”的属性“ParentId”的支持字段,并且该属性没有 getter。
这是我对子实体的配置:
// create shadow property for Parent
builder.Property<int>("ParentId").IsRequired();
// make shadow property and foreign key the PK as well
// i know this may not make the most sense here
// in this scenario but it's what I want to do.
builder.HasKey("ParentId");
// configure FK
builder.HasOne(o => o.Parent)
.WithOne()
.HasForeignKey<Child>("ParentId");
还有我的实体:
public class Parent
{
public int Id { get; set; }
}
public class Child
{
public Parent Parent { get; private set; }
public void SetParent(Parent p) => Parent = p;
}
当我调用 dbContext.Children.Contains(myChild) 时发生错误:
var child = new Child();
child.Parent = new Parent();
dbContext.Children.Add(child);
dbContext.SaveChanges();
// works fine
Assert.True(dbContext.Children.Any());
// throws InvalidOperationException
Assert.True(dbContext.Children.Contains(myChild)):
如果我将阴影属性作为真实属性添加到模型中,如下所示:
public class Child
{
public int ParentId { get; set;}
public Parent Parent { get; private set; }
public void SetParent(Parent p) => Parent = p;
}
然后一切正常。但如果可能的话,我想保留它的影子属性。
解决方案
更新:
刚查了3天前发布的EF Core 3.1.7,异常消失了,说明已经上报/识别并修复。因此,您可以简单地升级到该版本。
原来的:
阴影属性的配置很好。不幸的是,您遇到了 EF Core 3.x 错误之一。
为了将Contains
方法转换为 SQL,EF Core 必须将其转换为 PK 相等比较,例如(在伪代码中)
dbContext.Children.Any(c => PK(c) == PK(myChild))
从异常堆栈跟踪中可以看出,当 PK 是影子属性时,显然没有这样做。
我目前检查了最新的 EF 5 预览版,它似乎已修复(问题消失了)。因此,在它发布之前,解决方法是将隐式实体相等比较(例如Contains(entity)
,Equals(entity)
等== entity
)替换为相应的显式 PK 比较。
在这种情况下,而不是
dbContext.Children.Contains(child)
你可以使用
dbContext.Children.Any(c => c.Parent.Id == child.Parent.Id)
(由于另一个 v3.x 缺陷,SQL 翻译更差)
或者
dbContext.Children.Any(c => EF.Property<int>(c, "ParentId") == child.Parent.Id)
(与 v5.0 一样的正确 SQL 翻译,但使用“魔术”字符串并需要显式指定影子属性名称和类型)
推荐阅读
- 2sxc - 如何不在空列表中显示演示项目?
- selenium - how to set chrome download path in protractor
- python - 我可以将数据框中的字符串数据更改为特定格式的日期时间吗?
- c++ - 将文件读取到向量的向量,超出范围错误
- spring-boot - 我可以使用消息队列坐在我的应用程序和外部系统之间来跟踪所有发出的信息吗?
- node.js - 执行 react-native-init 命令时出错
- facebook - 如何允许 Facebook 同时从 localhost 和托管生产域的开发中登录?
- java - 如何在Java中保存字体文件?
- javascript - 如何格式化作为对象数组中的值的日期
- java - 尝试在 Pi 上的 java 中的 RXTX 代码中设置 lib 路径