EF Core抛出“'this'类型不能是接口本身”。

朱瑞

我在使用EF Core 3.1时遇到问题。直到最近都可以使用的代码。我有在DbContext上调用SaveChanges之前调用的此方法:

private void SetProps<TEntity>(TEntity dbEntity, EntityState newState)
    where TEntity : class, new()
{
    var entry = this.dbContext.Entry(dbEntity);
    ...
    if (dbEntity is IDbEntityBase dbEntityBase)
    {
        var baseEntry = this.dbContext.Entry(dbEntityBase);
        if (newState == EntityState.Added)
        {
            baseEntry.Property(t => t.Id).CurrentValue = Guid.NewGuid();
        }
    }
}

遗漏了大量代码以便于阅读,因此任何设计更改都将难以完成。

我遇到的问题是致电baseEntry.Property(t => t.Id).CurrentValue = Guid.NewGuid();调用该代码时,EF抛出异常'this' type cannot be an interface itself.

IDbEntity是所有实体类都实现的一些基本接口(它具有一些公共属性)。

EF调用堆栈如下所示:

System.ArgumentException: 'this' type cannot be an interface itself.
  at System.RuntimeTypeHandle.VerifyInterfaceIsImplemented(RuntimeTypeHandle interfaceHandle)
  at System.RuntimeType.GetInterfaceMap(Type ifaceType)
  at System.Reflection.RuntimeReflectionExtensions.GetRuntimeInterfaceMap(TypeInfo typeInfo, Type interfaceType)
  at Microsoft.EntityFrameworkCore.Infrastructure.ExpressionExtensions.GetPropertyAccess(LambdaExpression propertyAccessExpression)
  at Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry`1.Property[TProperty](Expression`1 propertyExpression)
  at InDocEdge.Sap.Database.EfContext.SapDbContext.ProcessBeforeSaveChangesData() in C:\MyCode\MyDbContext.cs:line 2
  at InDocEdge.Sap.Database.EfContext.SapDbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken) in C:\MyCode\MyDbContext.cs:line 1

该代码直到最近才起作用,但是现在(以我的理解),EF不满意我为Entry方法提供接口类型,我认为这是可能的。

有谁知道可能出什么问题或如何解决此问题?

David Browne-微软

接口类型没有EntityEntry这样的东西。它必须是一个实体类型。并且EntityEntry<TEntity>.Property需要找到实体类型属性,而不是接口属性(它们在概念上可能实际上不同)。

但是在通常情况下,您的Entity的属性实现IDbEntityBase.Id也将称为Id,您可以将该名称传递给entry.Property(string),例如:

private void SetProps<TEntity>(TEntity dbEntity, EntityState newState) where TEntity : class, new()
{
    var entry = Entry(dbEntity);

    if (dbEntity is IDbEntityBase)
    {
        if (newState == EntityState.Added)
        {
            entry.Property(nameof(IDbEntityBase.Id)).CurrentValue = Guid.NewGuid();
        }
    }
}

或者,由于仅设置了EntityEntry.CurrentValue,因此可以直接通过Entity对象,通过IDbEntityBase引用而不是EntityEntry对其进行设置。例如:

    private void SetProps<TEntity>(TEntity dbEntity, EntityState newState) where TEntity : class, new()
    {
        if (dbEntity is IDbEntityBase dbEntityBase)
        {
            if (newState == EntityState.Added)
            {
                dbEntityBase.Id = Guid.NewGuid();
            }
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

升级到EF 6(RTM)-获取System.Data.Entity.Core.Objects.ObjectContext不能用于返回类型System.Data.Objects

来自分类Dev

不能抛出UnderflowException类型的异常;

来自分类Dev

EF Core和Azure

来自分类Dev

EF Core执行SQL

来自分类Dev

EF Core错误的连接语句

来自分类Dev

EF Core中的获取迁移

来自分类Dev

EF Core 2.1 Linq查询到EF Core 3.0

来自分类Dev

Ef Core 3实体类型XOrder不能映射到表,因为它是从Order派生的。只能将基本实体类型映射到表

来自分类Dev

EF Core:插入大量数据

来自分类Dev

将复合类型从Postgresql映射到ef core

来自分类Dev

不能在EF Core 3.1查询中使用.AddDays

来自分类Dev

EF Core动态忽略列

来自分类Dev

分组加入EF Core 3.1

来自分类Dev

EF Core中的IsNumeric

来自分类Dev

EF Core配置复杂类型

来自分类Dev

EF Core-参数化数字集合时FromSql抛出无效数字

来自分类Dev

为什么我不能使用postgresql将IsTsVectorExpressionIndex添加到EF CORE的modulebuilder中?

来自分类Dev

EF Core中按ID和类型的关系

来自分类Dev

关于EF Core中的“自有”类型

来自分类Dev

EF Core包含查询

来自分类Dev

EF Core连接结果的通用类型类

来自分类Dev

莫庆EF抛出异常

来自分类Dev

编码MySql EF Core

来自分类Dev

EF Core 更新无法跟踪实体类型“广告”的实例

来自分类Dev

EF Core SingleOrDefaultAsync 编译时返回类型错误

来自分类Dev

更新 ContextModelSnapshot EF Core

来自分类Dev

EF 时间原始类型

来自分类Dev

为什么 EF Core 会抛出“数据库已经存在”?

来自分类Dev

从 EF Core 2 迁移到 EF Core 3