Csharp/C#教程:EF6渴望加载相关实体的单一属性分享


EF6渴望加载相关实体的单一属性

在EF6中,我有一个实体Customer,其导航属性为实体地址。 地址实体包含属性“City”。

我可以急切地加载Address实体,同时让所有客户都这样:

_dbSet.Customers.Include(customer => customer.Address); 

这给了我所有的客户,所有的地址属性都是热切的。

当然这很好用,但是我在Address表中唯一需要的是“City”字段,在不需要它们的情况下从持久数据存储(SQL Server)获取所有地址属性并不好。

我尝试了以下方法:

 _dbSet.Customers.Include(customer => customer.Address.City); 

…但这给了我一个运行时exception:

 An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll Additional information: A specified Include path is not valid. The EntityType 'MyModel.Address'does not declare a navigation property with the name 'City'. 

我理解这一点,因为City只是一个字段,而不是与另一个表/实体的关系。

但有没有另一种方法可以实现我想要的,或者是最好的做法只包括整个地址实体,即使我只需要城市领域???

我想要的是我可以使用myCustomer.Address.City,而不需要对数据库进行额外的查询,但是当我使用myCustomer.Address.Street时,街道属性不是急切加载的,应该另外从中获取数据库…

如果您真的开始在整个代码库中使用相同的实体,那么您可以使用类似于Stef提出的内容解决问题:

 var query = _dbSet.Customers.Include(customer => customer.Address); var data = query .Select(c => new { Customer = c, City = c.Address.City }) .ToList() //executes the IQueryable, and fetches the Customer and City (only) from the DB .ForEach(x => x.Customer.Address = new Address { City = x.City }) .Select(x => x.Customer) .ToList(); 

我非常支持DTO而不是在整个代码库中使用实体对象,但上面将给出一个Customer列表,其中包含Address对象,其中只填充了City字段。 显然,我假设您的对象具有公共setter,实体对象通常具有公共setter。

只选择您想要的属性,EF只会加载所需的属性。

上述就是C#学习教程:EF6渴望加载相关实体的单一属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 var query = _dbSet.Customers.Include(customer => customer.Address); var data = query.Select(c => new { Customer = c, City = c.Address.City }); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1016486.html

(0)
上一篇 2021年12月31日
下一篇 2021年12月31日

精彩推荐