EntityFramework Core Raw Query再叙注意事项
前言
最近一直比较忙没有太多时间去更新博客,接下来会一直持续发表相关内容博客,上一篇我们讲到了EF Core中的原始查询,这节我们再来叙述一下原始查询,本文是基于在项目当中用到时发现的问题。
话题
我们通过EF Core原始查询主要是用于一些需要连接多个表进行复杂查询,下面我们来回顾下。我们定义一个ViewModel。
public class BlogViewModel
{
public string Name { get; set; }
public string Url { get; set; }
public string Title { get; set; }
public string Content { get; set; } }
我们将表Blog和Post表进行连接查询出两个表中的列,定义如下接口。
BlogViewModel GetBlog(int BlogId);
接下来我们来写SQL语句。
private EFCoreContext _efCoreContext;
public BlogRepository(EFCoreContext efCoreContext) : base(efCoreContext)
{
_efCoreContext = efCoreContext;
} public BlogViewModel GetBlog(int BlogId)
{
var sql = @"SELECT Name, Url, Content, Title
FROM dbo.Blog
INNER JOIN dbo.Post ON dbo.Post.BlogId = dbo.Blog.Id
WHERE dbo.Blog.Id = {0}";
var blogSingle = _efCoreContext.Set<BlogViewModel>().FromSql(sql, BlogId);
return blogSingle.ToList().FirstOrDefault();
}
然后我们在控制器中进行查询。
public IActionResult Index()
{
var blog = _blogRepository.GetBlog();
return Ok();
}

此时会出现如下错误:
Cannot create a DbSet for 'BlogViewModel' because this type is not included in the model for the context.
我们知道当我们利用原始查询出来的实体非EF Entity,而是由我们自定义的ViewModel。所以才会出现BlogViewModel未在EF上下文中,所以为了解决上述问题我们需要在EF上下文中定义ViewModel,如下:
public class EFCoreContext : DbContext
{
public EFCoreContext(DbContextOptions options) : base(options) { } public DbSet<BlogViewModel> BlogViewModels { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddEntityConfigurationsFromAssembly(GetType().GetTypeInfo().Assembly);
}
}
然后我们在利用SQL查询时需要用到上述BlogViewModels。如下:
public BlogViewModel GetBlog(int BlogId)
{
var sql = @"SELECT Name, Url, Content, Title
FROM dbo.Blog
INNER JOIN dbo.Post ON dbo.Post.BlogId = dbo.Blog.Id
WHERE dbo.Blog.Id = {0}";
var blogSingle = _efCoreContext.BlogViewModels.FromSql(sql, BlogId);
return blogSingle.ToList().FirstOrDefault();
}
我们再来看看运行结果,结果依然出错,错误显示如下:
其他信息: The entity type 'BlogViewModel' requires a primary key to be defined.
根据提示我们再将BlogViewModel添加一个主键。
public class BlogViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public string Title { get; set; }
public string Content { get; set; } }
当然此时我们在写SQL时也要返回主键Id。
var sql = @"SELECT b.Id, b.Name, b.Url, p.Content, p.Title
FROM dbo.Blog AS b
INNER JOIN dbo.Post AS p ON p.BlogId = b.Id
WHERE b.Id = {0}";
此时我们再来运行看看。

总结
本节我们探讨了EF Core中进行原始查询需要注意的地方,我们再来做一个总结,当我们利用EF Core返回一个ViewModel的话,此时我们需要将ViewModel定义在上文中,同时在ViewModel中需要定义一个主键,否则会出错。好了,今天到此结束,我们下一篇会讲讲EF Core中的并发以及如何解决并发问题,多说一句,个人公众号一直在更新和同步中,后续有可能一些比较简短的内容会只在公众号上更新,为了让用户查阅公众号内容更加便捷也在探索公众号中,希望大家多多关注。
EntityFramework Core Raw Query再叙注意事项的更多相关文章
- EntityFramework Core Raw Query再叙注意事项后续
前言 话说通过EntityFramwork Core进行原始查询又出问题,且听我娓娓道来. EntityFramework Core Raw Query后续 当我们进行复杂查询时我们会通过原始查询来进 ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
前言 EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应.显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- EntityFramework 7 更名为EntityFramework Core(预发布状态)
前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...
- EntityFramework Core 1.1有哪些新特性呢?我们需要知道
前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...
- EntityFramework Core高并发深挖详解,一纸长文,你准备好了吗?
前言 之前有关EF并发探讨过几次,但是呢,博主感觉还是有问题,为什么会觉得有问题,其实就是理解不够透彻罢了,于是在项目中都是用的存储过程或者SQL语句来实现,利用放假时间好好补补EF Core并发的问 ...
- EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗?
前言 之前有关EF并发探讨过几次,但是呢,博主感觉还是有问题,为什么会觉得有问题,其实就是理解不够透彻罢了,于是在项目中都是用的存储过程或者SQL语句来实现,利用放假时间好好补补EF Core并发的问 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
随机推荐
- [译]Java 设计模式之命令
(文章翻译自Java Design Pattern: Command) 命令设计模式在进行执行和记录的时候需要一个操作及其参数和封装在一个对象里面.在下面的例子中,命令是一个操作,它的参数是一个Com ...
- 学习PHP时的一些总结(四)
目录的基本操作: 在系统的每个目录下都有两个特殊的目录"."和".." , 分别指示当前目录和当前目录的父目录. dirname() 返回目录的名称 path ...
- ReviewBoard安装和配置说明
眼下部门还没有採用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多採用走查方式.即代码写完后召开一个Code Review的Meeting,集中时间和经验 ...
- HPQC HP Quality Center windows 服务
HPQC HP Quality Center windows 服务已经启动的话,就不用运行run.bat 两个是一样的效果.
- oracle实现自加力id
--oracle实现自加力id --创建一个T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pr ...
- 【转】GitHub 优秀的 Android 开源项目
转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...
- 无线连接手机进行Android测试
当每天走到哪都要拿一根数据线进行项目测试的时候,总是有一些焦急和烦躁的,如果能够无线连接测试就在好不过了. 这样不再是什么难事了,只需要几步走: 在进行无线连接测试的过程中,你的手机必须root了,这 ...
- GoogleGoogle搜索解析
GoogleGoogle搜索解析 是一个类似Google趋势SEO 在 线keyword工具.它的正式口号提出“在搜索些什么”.利用Google搜索解析,能够比較特定区域.类别.时间范围以及搜索资源之 ...
- oracle中intersect的用法
和 UNION 指令类似, INTERSECT 也是对两个 SQL 语句所产生的结果做处理的.不同的地方是, UNION 基本上是一个 OR (如果这个值存在于第一句或是第二句,它就会被选出),而 I ...
- AngularJS+requireJS项目的目录结构设想
AngularJS+requireJS项目的目录结构设想 准备用AngularJS + require.js 作为新项目的底层框架,以下目录结果只是一个初步设想: /default 放页面,不过 ...