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类加载机制
		你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ... 
随机推荐
- 开源的.Net ORM微型框架SuperHelper
			SuperHelper——灵活通用的.开源的.Net ORM微型框架 SuperHelper是博主利用业余时间编写的一个ORM微型框架,除了可以提高开发效率,与其它ORM框架相比,博主更加喜欢Supe ... 
- ajax的get请求
			get和post是http请求方法最主要的两种方式. get: 先实现一个简单的get请求 index.html <!DOCTYPE html> <html lang="e ... 
- NHibernate:教你如何搭建数据访问层?
			NHibernate:教你如何搭建数据访问层? 什么是NHibernate NHibernate 是一个基于.net 的针对关系型数据库的对象持久化类库.NHibernate 来源于非常优秀的基于Ja ... 
- Redis .NET开源组件Beetle.Redis
			Redis .NET开源组件Beetle.Redis Beetle.Redis是一款开源的Redis Client for .net组件,它提供非常简便的操作方式可以让开发人员轻松地访问Redis,同 ... 
- 【C基础】const用法
			1.const 和 define 异同 同:const 和 define都是修饰常量 异:const修饰的常量只是编译器的一种优化,它是可以通过内存地址修改const修饰的常量:而define修饰的常 ... 
- 【C#基础知识】静态构造函数,来源于一道面试题的理解
			看到园友的一道面试题,很好奇,测试了一下结果. public class A { public static int X=B.Y ; public A() { ++X; } } public clas ... 
- 优化算法-BFGS
			优化算法-BFGS BGFS是一种准牛顿算法, 所谓的"准"是指牛顿算法会使用Hessian矩阵来进行优化, 但是直接计算Hessian矩阵比较麻烦, 所以很多算法会使用近似的He ... 
- Stream使用教程
			现在,计算机CPU运行速度的快速发展已经远远超过了内存的访问速度.越来越多的程序性能被内存带宽所限制,而不是计算机的CPU运行速率. Stream benchmark是一个简单的合成基准测试程序,衡量 ... 
- 企业架构研究总结(32)——TOGAF架构内容框架之架构交付物
			3. 架构交付物(Architecture Deliverables) 架构交付物是在整个架构开发方法循环过程中所产生或被使用的契约性且正规化的企业架构内容,因而其与企业架构开发方法有着紧密的联系.本 ... 
- Object-c学习之路五(@protocol协议)
			今天模拟Button的delegate来联系一下protocol. Button类 // Button.h // Protocal // // Created by WildCat on 13-7-2 ... 
