找不到实体类型的属性的后备字段,并且该属性没有吸气剂

马龙

我有一个例外

System.InvalidOperationException : No backing field could be found for property 'ApartmentId' of entity type 'Address' and the property does not have a getter.

这是我的Apartment课:

public class Apartment
{
    public Apartment(Address address)
    {
        Address = address;
    }

    private Apartment()
    {
    }

    public int Id { get; private set; }
    public Address Address { get; private set; }
}

这是我的Address值对象类:

public class Address : IEquatable<Address>
{
    private Address()
    {
    }

    public Address(string streetNumber, string streetName, string city, string state, string zipCode)
    {
        StreetNumber = streetNumber;
        StreetName = streetName;
        City = city;
        State = state;
        ZipCode = zipCode;
    }

    public string StreetNumber { get; private set; }
    public string StreetName { get; private set; }
    public string City { get; private set; }
    public string State { get; private set; }
    public string ZipCode { get; private set; }

    public bool Equals(Address other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }

        if (ReferenceEquals(this, other))
        {
            return true;
        }

        return String.Equals(StreetNumber, other.StreetNumber, StringComparison.OrdinalIgnoreCase) &&
               String.Equals(StreetName, other.StreetName, StringComparison.OrdinalIgnoreCase) &&
               String.Equals(City, other.City, StringComparison.OrdinalIgnoreCase) &&
               String.Equals(State, other.State, StringComparison.OrdinalIgnoreCase) &&
               String.Equals(ZipCode, other.ZipCode, StringComparison.OrdinalIgnoreCase);
    }
}

在我的实体配置中,我使用builder.OwnsOne(a => a.Address);在我的存储库中,我进行了以下调用:

    public async Task<Apartment> GetByAddressAsync(Address address)
    {
        return await _context.Apartments.FirstOrDefaultAsync(a => a.Address.Equals(address));
    }

并产生上面的异常。有任何想法吗?我不知道为什么它说我的Address值对象中有一个“ ApartmentId”

伊万·斯托夫

异常消息当然是荒谬的,与实际问题没有任何共同之处,即表达

a => a.Address.Equals(address)

它是IQueryable表达式树的一部分,因此EF Core尝试将其转换为SQL。

诸如封装之类的面向对象的功能不能与基于可见性和知识的表达式转换配合使用。EF Core不是反编译器,它看不到您Equals方法的实现他们通常使用未知方法执行的操作是抛出运行时异常,要求您使用可翻译构造或显式切换到客户端评估。

但是实体类型有特殊处理。EF Core试图通过将相等隐式转换为PK(主键)比较来支持相等比较(==,'!= ,Equals`)转换。

这是您拥有的实体类型的问题。请注意,拥有的实体类型仍然是实体类型,但是像您Address这样的引用拥有的类型没有自己的PK,因此是例外。

当然,他们所做的只是一个错误,但是即使他们“修复”了该错误,修复也只是不同的运行时异常。

解决方案当然是不使用该Equals方法,而是使用显式成员比较,例如

a => a.Address.StreetNumber.ToUpper() == address.StreetNumber.ToUpper()
    && a.Address.StreetName.ToUpper() == address.StreetName.ToUpper()
    && a.Address.City.ToUpper() == address.City.ToUpper()
    && a.Address.State.ToUpper() == address.State.ToUpper()
    && a.Address.ZipCode.ToUpper() == address.ZipCode.ToUpper()

请注意,字符串比较是由数据库控制的,因此ToUpper()如果您需要执行不区分大小写的比较则需要显式的比较。

现在我知道这是一个重复代码和休息的封装,但是这是唯一的方法(如果你使用一些第三方库一样,除了LAMBDA注射NeinLinq.EntityFrameworkCoreDelegateDecompiler来获得服务器端过滤等)。

因为客户端在读取整个表后进行过滤就像

_context.Apartments.AsEnumerable().FirstOrDefault(a => a.Address.Equals(address))

会成为性能杀手(这是在EF Core 3.0+中删除隐式客户端评估的原因),而不是不算缺乏自然async支持(需要额外的程序包,这反过来会导致EF Core出现问题DbSet-请参阅转换EF Core查询从2.2到3.0-async await)。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架核心 DbContextOptionsBuilder.UseModel 创建没有属性的实体类型

来自分类Dev

基于Scala类型的属性提取器-仅吸气剂镜头?

来自分类Dev

在课堂上找不到密码的吸气剂

来自分类Dev

找不到预期的吸气剂方法

来自分类Dev

每个原子实体中的实体类型属性

来自分类Dev

无法添加实体类型“出版物”的种子实体,因为没有为所需属性“图像”提供任何值

来自分类Dev

Android Studio:会议室:错误:找不到字段的吸气剂

来自分类Dev

如何在带有点的属性上使用Ember的吸气剂/设定剂?

来自分类Dev

没有属性的吸气方法...错误

来自分类Dev

具有TPH继承的实体类型到多个表的EF映射属性

来自分类Dev

具有TPH继承的实体类型到多个表的EF映射属性

来自分类Dev

如何覆盖符合KVO的属性的吸气剂?

来自分类Dev

约束不能放在属性或吸气剂上

来自分类Dev

Symfony 2.8表单实体类型自定义属性

来自分类Dev

纯吸气剂自动属性和表达式主体属性有什么区别?

来自分类Dev

InvalidOperationException:找不到实体类型'PassengerViewModel'。确保已将实体类型添加到模型中

来自分类Dev

实体类型没有定义键EF6

来自分类Dev

Protobuf-net:如何从隐含所有公共字段的波尔图合同中排除只读属性(仅具有吸气剂)?

来自分类Dev

Protobuf-net:如何从隐含所有公共字段的波尔图合同中排除只读属性(仅具有吸气剂)?

来自分类Dev

实体框架异常:找不到适合实体类型“CultureInfo”的构造函数

来自分类Dev

Hibernate - 具有作为接口的属性的实体类

来自分类Dev

目标实体没有属性

来自分类Dev

Uncaught TypeError:无法设置第4行只有吸气剂的#号属性playerNo

来自分类Dev

使用仅具有吸气剂的自动属性(C#6功能)的接口的显式实现

来自分类Dev

未被捕获的TypeError:无法设置仅具有吸气剂的#<HTMLElement>的属性offsetWidth

来自分类Dev

如何修复“无法设置仅具有吸气剂的[对象对象]的属性userInfo $”错误

来自分类Dev

如何修复“无法设置仅具有吸气剂的[对象对象]的属性userInfo $”错误

来自分类Dev

TypeORM + TypeError:无法设置仅具有吸气剂的#<Object>的属性EntityManager

来自分类Dev

Jest + Nestjs + Nestjsx Crud | 无法设置仅具有吸气剂的[object Object]的属性findOne

Related 相关文章

  1. 1

    实体框架核心 DbContextOptionsBuilder.UseModel 创建没有属性的实体类型

  2. 2

    基于Scala类型的属性提取器-仅吸气剂镜头?

  3. 3

    在课堂上找不到密码的吸气剂

  4. 4

    找不到预期的吸气剂方法

  5. 5

    每个原子实体中的实体类型属性

  6. 6

    无法添加实体类型“出版物”的种子实体,因为没有为所需属性“图像”提供任何值

  7. 7

    Android Studio:会议室:错误:找不到字段的吸气剂

  8. 8

    如何在带有点的属性上使用Ember的吸气剂/设定剂?

  9. 9

    没有属性的吸气方法...错误

  10. 10

    具有TPH继承的实体类型到多个表的EF映射属性

  11. 11

    具有TPH继承的实体类型到多个表的EF映射属性

  12. 12

    如何覆盖符合KVO的属性的吸气剂?

  13. 13

    约束不能放在属性或吸气剂上

  14. 14

    Symfony 2.8表单实体类型自定义属性

  15. 15

    纯吸气剂自动属性和表达式主体属性有什么区别?

  16. 16

    InvalidOperationException:找不到实体类型'PassengerViewModel'。确保已将实体类型添加到模型中

  17. 17

    实体类型没有定义键EF6

  18. 18

    Protobuf-net:如何从隐含所有公共字段的波尔图合同中排除只读属性(仅具有吸气剂)?

  19. 19

    Protobuf-net:如何从隐含所有公共字段的波尔图合同中排除只读属性(仅具有吸气剂)?

  20. 20

    实体框架异常:找不到适合实体类型“CultureInfo”的构造函数

  21. 21

    Hibernate - 具有作为接口的属性的实体类

  22. 22

    目标实体没有属性

  23. 23

    Uncaught TypeError:无法设置第4行只有吸气剂的#号属性playerNo

  24. 24

    使用仅具有吸气剂的自动属性(C#6功能)的接口的显式实现

  25. 25

    未被捕获的TypeError:无法设置仅具有吸气剂的#<HTMLElement>的属性offsetWidth

  26. 26

    如何修复“无法设置仅具有吸气剂的[对象对象]的属性userInfo $”错误

  27. 27

    如何修复“无法设置仅具有吸气剂的[对象对象]的属性userInfo $”错误

  28. 28

    TypeORM + TypeError:无法设置仅具有吸气剂的#<Object>的属性EntityManager

  29. 29

    Jest + Nestjs + Nestjsx Crud | 无法设置仅具有吸气剂的[object Object]的属性findOne

热门标签

归档