LINQ存储Clients模型时List<Addresses>类型隐式转换错误如何解决
错误根本原因
你遇到的类型转换报错,是因为UI层传入的Clients类中ClientAddress属性关联的Addresses类,和ClientsEntity类中ClientAddress关联的Addresses类属于不同的命名空间,哪怕两个类的属性完全一致,CLR也会判定为两个完全独立的类型,因此List<UI层.Addresses>不能直接赋值给List<数据层.Addresses>。
解决方案
下面是3种常用的处理方式,可根据你的项目架构选择:
- 手动映射转换(最直接,无需引入额外依赖)
对地址列表做逐字段映射转换即可,修改你的业务代码如下:public Task<bool> StoreModel(Clients client) { var listtostore = new ClientsEntity() { Id = Guid.NewGuid().ToString(), // 主键需补值,可根据你的主键生成规则调整 Name = client.Name, FamilyName = client.FamilyName, ClientAddress = client.ClientAddress.Select(uiAddr => new Addresses { Id = Guid.NewGuid().ToString(), // 地址表主键也需赋值 Address = uiAddr.Address }).ToList() }; // 后续补充将listtostore存入数据库的逻辑即可 } - 自动映射工具(适合字段多、映射场景多的项目)
引入AutoMapper等对象映射库,提前配置好UI层Addresses和数据层Addresses的映射规则,之后直接调用映射方法即可:// 映射规则全局仅需配置一次 var config = new MapperConfiguration(cfg => { cfg.CreateMap<UI命名空间.Addresses, 数据层命名空间.Addresses>(); }); var mapper = config.CreateMapper(); // 业务代码中直接转换 ClientAddress = mapper.Map<List<Addresses>>(client.ClientAddress) - 统一实体定义(架构优化方案)
如果项目分层允许,可以把Addresses、Clients这类公共实体抽离到独立的共享类库,各层都引用同一个类定义,就不需要额外做类型转换了。
额外提醒:你定义的
Clients类中Name属性类型为double?,不符合常规姓名的存储逻辑,大概率是笔误,建议修改为string?类型,避免后续存数据出错。
内容的提问来源于stack exchange,提问作者moris62
相关产品推荐
相关产品推荐

