【发布时间】:2020-05-09 01:42:36
【问题描述】:
我正在为我的公司构建概念验证。我们有一个现有的平台,我们将用现代技术来替换它。目前,我仅限于使用我们现有的具有多个无键表的数据库。我正在构建一个 Blazor WebAssembly 应用程序,该应用程序使用 gRPC 调用 .net 核心 Web 应用程序。我的问题是我正在使用 EF Core 与现有数据库进行通信,但是在调用 DbContext.Attach(shipment)时出现异常@
"The navigation '' cannot be added because it targets the keyless entity type 'Document'. Navigations can only target entity types with keys."
Document 是被Attached 到DbContext 的实体上的导航属性。
Shipment 是一个非常庞大且复杂的数据结构,具有很多层。有没有办法避免在模型结构中为每个实体 DbContext.Entry(entity).State = EntityState.Added 设置实体状态?
或者可能将 DbSet 的 CRUD 操作映射到存储过程?
编辑
这是一个大大缩短的架构版本,但这就是与问题相关的全部内容。
public class Shipment
{
public int Id { get; set; }
// 60 other properties
public virtual ICollection<Document> Documents { get; set; }
}
public class Document
{
public int ShippingId { get; set; }
public string DocumentType { get; set; }
public byte[] Content { get; set; }
public virtual Shipment Shipment { get; set; }
}
当我尝试将Shipment 实体附加到DbContext 或手动设置其状态时,我得到了上述异常。
同样,我目前无法更改数据库架构,还有许多其他类似于 Document 的模型没有密钥或添加密钥的方法。
编辑 2
我知道这需要进一步解释。显然,DbContext 将无法插入/更新/删除,因为没有密钥,它不知道如何操作。我只需要在获取Shipping 实体并设置导航属性Documents 时能够阅读。但是保存Shipping时,完全忽略导航属性即可。
【问题讨论】:
-
您有可以分享的架构或数据库图吗?我很难理解您希望无键表格的导航属性如何工作。
-
考虑阅读Keyless Entity Types 文档。它们有很多限制,基本上只能用于数据读取,不能用于添加/更新/删除。即只有 CRUD 的 R 部分。
-
如错误提示,将 Key 添加到 Document 实体。您可以使用 Data annotations
[Key]将属性表示为 pk。 -
@LinkedListT 正如我上面所说的几次,我无法更改数据库架构。
-
我们不要求更改数据库中的架构。实体具有将数据库对象链接到 c# 类的映射文件(模型)。模型需要更新。
标签: c# entity-framework .net-core entity-framework-core asp.net-core-2.1