带有 EF 和自动映射器的 OData:无法比较..'。仅支持原始类型、枚举类型和实体类型

Posted

技术标签:

【中文标题】带有 EF 和自动映射器的 OData:无法比较..\'。仅支持原始类型、枚举类型和实体类型【英文标题】:OData with EF and automapper: Cannot compare..'. Only primitive types, enumeration types and entity types are supported带有 EF 和自动映射器的 OData:无法比较..'。仅支持原始类型、枚举类型和实体类型 【发布时间】:2018-02-20 04:09:53 【问题描述】:

有一个带有 ef 6.1.3 和 automapper 6.1.1 的 Odata v3 端点。

数据模型,

Orderlines,一对多的订单

公共部分类订单 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 公共秩序() this.OrderLines = new HashSet();

public System.Guid OrderID  get; set; 
public string OrderPlacedBy  get; set; 
public Nullable<System.DateTime> PlacedTime  get; set; 

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<OrderLine> OrderLines  get; set; 

订单行

公共部分类 OrderLine 公共 System.Guid OrderLineID 获取;放; 公共 Nullable OrderID 获取;放; 公共可空量获取;放;

    public virtual Order Order  get; set; 

AutoMapper 代码,

cfg =>
            
                cfg.AllowNullDestinationValues = true;
                cfg.AllowNullCollections = true;
                cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
                cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
                cfg.RecognizeDestinationPrefixes("DTO_");

                cfg.CreateMap<Order, OrderDTO>()
                    .ForMember(d=>d.OrderLines,o=>o.AllowNull())
                    .ForMember(d=>d.OrderLines,o=>o.MapFrom(s=>s.OrderLines));
                cfg.CreateMap<OrderLine, OrderLineDTO>();
            );

现在如果我通过

浏览 URL

http://localhost:34354/odata/Order?$expand=OrderLines

它在下面抱怨错误

无法比较“c4codata.OrderDTO”类型的“成员“OrderLines”。仅支持原始类型、枚举类型和实体类型。

我做错了什么?这困扰了我好几天,请帮忙!!

我已将 repo 上传到https://github.com/ninithepug/odata

【问题讨论】:

【参考方案1】:

问题是,您首先使用数据库。所有的 AM 测试都首先使用代码,这才是真正有效的。所以你也应该这样做。 Working gist.

【讨论】:

谢谢,我不能先使用代码,因为数据库模型不能改变。我会测试你分享的代码谢谢你的帮助!! 也看到这似乎与我的确切问题但是仍然不起作用..github.com/AutoMapper/AutoMapper/issues/925 没有人说要更改数据库。您可以编写实体,使其与现有数据库匹配。 好的,我运行它正在工作的代码,但是如果我将相同的代码放入 OData (v3) 中,它会返回相同的错误..所以它没有帮助.. 如果您可以将其简化为仅涉及 AM 的问题,我会看看。我真的不在乎其余的。

以上是关于带有 EF 和自动映射器的 OData:无法比较..'。仅支持原始类型、枚举类型和实体类型的主要内容,如果未能解决你的问题,请参考以下文章

防止 Mapstruct 在自动映射器检测中使用方法

无法在 Sqoop 导出中自定义的映射器数量

带有命名参数和行映射器的列表的Java Jdbctemplate查询?

带有数据映射器 ORM 的 CodeIgniter

‘终结点映射器中没有更多的终结点可用’

MyBatis 无法识别映射器 xml 文件 - 无效的绑定语句(未找到)