EntityFramework Core Raw Query再叙注意事项后续

前言

话说通过EntityFramwork Core进行原始查询又出问题,且听我娓娓道来。

EntityFramework Core Raw Query后续

当我们进行复杂查询时我们会通过原始查询来进行,我们定义如下ViewModel

    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; }

    }

我们接着在Blog仓储接口中定义如下接口

    public interface IBlogRepository : IEntityBaseRepository<Blog>
    {
        BlogViewModel GetBlog(int BlogId);
    }

接着我们实现其接口

        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();
        }

然后为了在上下文中跟踪到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);
        }
    }

到了这里我们再来进行查询肯定是没毛病,接下来我们来说明进行原始查询出现的问题。当我们需要用到ViewModel时就会去进行定义,我们是在进行迁移之后进行的,如果我们对实体进行了修改,此时我们就需要再进行迁移,下面我们进行迁移看看。

我们定义的ViewModel未配置映射竟然映射到表中了,如上则是本节需要阐述的问题,当我们在进行迁移之后定义ViewModel,此时EF上下文会检测到ViewModel并将其进行跟踪,同理,当我们定义了ViewModel之后再进行迁移时EF上下文会检测到ViewModel并将其作为实体映射到表,所以会出现意想不到的结果,这个算是bug吗?应该不算,EF团队既然想到需要将ViewModel定义到上下文中会将其进行跟踪并映射到数据库中,但是这个ViewModel并不是我们需要的实体,EF团队肯定给出了解决方案,我寻思着既然对实体中的属性可以进行忽略映射,那么是否对实体也可以进行忽略映射呢,我们进行如下设置来忽略实体映射到表看看。

    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);
            modelBuilder.Ignore<BlogViewModel>();
        }
    }

 

到这里我们本节的话题才算结束。

总结

我们再来对EF中使用原始查询做个最终总结,我们需要在上下文中定义ViewModel,但是我们不希望将其映射到表中,我们需要通过  modelBuilder.Ignore<ViewModel>(); 来忽略实体映射。

时间: 2024-08-16 08:54:28

EntityFramework Core Raw Query再叙注意事项后续的相关文章

EntityFramework Core Raw Query再叙注意事项

前言 最近一直比较忙没有太多时间去更新博客,接下来会一直持续发表相关内容博客,上一篇我们讲到了EF Core中的原始查询,这节我们再来叙述一下原始查询,本文是基于在项目当中用到时发现的问题. 话题 我们通过EF Core原始查询主要是用于一些需要连接多个表进行复杂查询,下面我们来回顾下.我们定义一个ViewModel. public class BlogViewModel { public string Name { get; set; } public string Url { get; se

EntityFramework Core Raw SQL

前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFramework Core Raw SQL 基础查询(执行SQL和存储过程) 啥也不说了,拿起键盘就是干,如下: public class HomeController : Controller { private IBlogRepository _blogRepository; public HomeC

EntityFramework 7 更名为EntityFramework Core(预发布状态)

前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要我再写一篇,最终经过思想斗争后,还是花了一点时间去继续探索.本篇比较理论的去分享最近EF进展,后面有时间会继续关注EF团队在EF上的动向,并给出相对应的实例. EF Core 1.0.0 (1)EntityFramework是微软在.NET中推荐使用的数据访问技术,而EntityFramework

EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6.x中不同,相同的则不再叙述. EntityFramework Core 1.1方法理论详解 当我们利用EF Core查询数据库时如果我们不显式关闭变更追踪的话,此时实体是被追踪的,关于变更追踪我们下节再叙.就像我们之前在EF 6.x中讨论的那样,不建议手动关闭变更追踪,对于有些特殊情况下,关闭变更追

EntityFramework Core 1.1有哪些新特性呢?我们需要知道

前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework Core 1.1中出现了哪些新特性供我们使用. EntityFramework Core 1.1新特性探讨 DbSet.Find 在EF 6.x中也有此方法的实现,在EF Core 1.1中也同样对此方法进行了实现,为什么要拿出来讲呢,当然也有其道理,我们一起来看看.在仓储中我们实现Find这个方法,

EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗?

前言 之前有关EF并发探讨过几次,但是呢,博主感觉还是有问题,为什么会觉得有问题,其实就是理解不够透彻罢了,于是在项目中都是用的存储过程或者SQL语句来实现,利用放假时间好好补补EF Core并发的问题,本文比较长,请耐心点看. EntityFramework Core并发初级版初探 关于并发无非就两种:乐观并发和悲观并发,悲观并发简言之则是当客户端对数据库中同一值进行修改时会造成阻塞,而乐观并发则任何客户端都可以对可以对数据进行查询或者读取,在EF Core中不支持悲观并发,结果则产生并发冲突

EntityFramework Core并发导致显式插入主键问题

前言 之前讨论过EntityFramework Core中并发问题,按照官网所给并发冲突解决方案以为没有什么问题,但是在做单元测试时发现too young,too simple,下面我们一起来看看. .NET Core 1.1单元测试问题 我们循序渐进,首先从单元测试开始说起,可能其中就有你在.NET Core上进行单元测试会遇到的问题,别着急,不妨一看.我们需要创建.NET Core类库,,如下: 接下来对project.json进行如下修改. { "version": "

EntityFramework Core迁移时出现数据库已存在对象问题解决方案

前言 刚开始接触EF Core时本着探索的精神去搞,搞着搞着发现出问题了,后来就一直没解决,觉得很是不爽,借着周末好好看看这块内容. EntityFramework Core迁移出现对象在数据库中已存在 在EF Core之前对于迁移的命令有很多,当进行迁移出现对象已在数据库中存在时我们通过如何命令即可解决: Add-Migration Initial -IgnoreChanges 但是在EF Core对于迁移现如今只存在如下两个命令: dotnet ef migrations add <<mi

EntityFramework Core不得不注意的性能优化意外收获,你会用错?

前言 这两天在着实研究EF Core项目当中对于一些查询也没实际去检测,于是想着利用放假时间去实际测试下,结果本文就出来了,too young,too simple,后续博主会从底层翻译表达式树弄起,来从源头了解EF Core,通过本文你会明白不是EF Core团队没做性能优化,而是你根本就没用过而且正在倒退. EntityFramework Core性能优化初探 简单粗暴直接上代码,给出上下文以及需要用到的测试类,如下: public class EFCoreContext : DbConte