实体框架核心无键导航问题

Pau*_*LLC 6 c# entity-framework entity-framework-core .net-core asp.net-core-2.1

我正在为我的公司构建一个概念验证。我们有一个现有的平台,我们将用现代技术来替换它。目前,我只能使用我们现有的数据库,其中有几个无键表。我正在构建一个 Blazor WebAssembly 应用程序,该应用程序使用 gRPC 调用 .net core 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."
Run Code Online (Sandbox Code Playgroud)

DocumentAttach是正在编辑的实体上的导航属性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; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将Shipment实体附加到DbContext或手动设置其状态时,出现上述异常。

同样,我目前无法更改数据库模式,并且还有许多其他类似的模型Document没有密钥或添加密钥的方法。

编辑2

我意识到这需要进一步解释。显然,它将DbContext无法插入/更新/删除,因为如果没有密钥,它就不知道如何操作。Shipping我所需要的只是在获取实体并设置导航属性时能够读取Documents。但保存时Shipping,完全忽略导航属性。

Pau*_*LLC 4

在试图证明 @jdweng 错误并生成异常时,当实体模型在数据库中没有支持字段时,我多次看到,我偶然发现了这个解决方案。

我添加public Guid Id { get; set; } = Guid.NewGuid();到所有无密钥实体,然后替换entity.HasNoKey();entity.HasAlternateKey(x => x.Id);使用ModelBuilder.

HasAlternateKey摘要:如果指定属性上尚不存在该实体类型的备用键,则在模型中创建该备用键。这将强制属性变为只读。

这正是我一直在寻找的。