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>(); 来忽略实体映射。







本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/6341442.html,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
人工智能 Dart 安全
SonarQube Server 2025 Release 2 发布 - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 2 发布 - 代码质量、安全与静态分析工具
143 4
SonarQube Server 2025 Release 2 发布 - 代码质量、安全与静态分析工具
|
7月前
|
人工智能 缓存 监控
AI 网关需要具备的 10 大基本能力
我们认为 AI 网关并不是独立于 API 网关的新形态,本质也是一种 API 网关,区别在于针对 AI 场景的新需求专门做了扩展,它既是 API 网关的继承,也是 API 网关的演进。因此我们从 API 视角,对 AI 网关的能力做了分类,便于形成概念的共识。
279 12
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
11月前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。
|
人工智能 网络安全 Python
修复旧照片,找到新感动
共赴亚运盛会
495 1
Unity精华☀️点乘、叉乘终极教程:用《小小梦魇》讲解这个面试题~
Unity精华☀️点乘、叉乘终极教程:用《小小梦魇》讲解这个面试题~
|
Linux 数据安全/隐私保护
在Linux中,如何添加一个用户到特定的组?
在Linux中,如何添加一个用户到特定的组?
|
人工智能 自然语言处理 搜索推荐
「AIGC」AIGC提供内容生成效率
**AI自动化内容生成**涉及自然语言、图像、视频和音频,如新闻自动生成、GANs创造图像、语音合成和模板化内容。工具如Automated Insights、Articoolo、Synthesia和Replica Studios分别在新闻、视频和音频领域应用。 **内容分发与推广**中,AI提供个性化推荐(如Netflix、Spotify)、社交媒体优化(Buffer、Hootsuite)、自动化广告投放(Google Ads、Facebook Ads),以及SEO优化。
189 0
|
传感器 物联网 大数据
物联网(IoT)技术与应用:塑造未来的智能化生活
【5月更文挑战第1天】物联网(IoT)技术整合传感器、嵌入式系统、云计算与大数据,连接智能设备,重塑生活与工作方式。应用涵盖智能家居、工业自动化、农业、智能城市及医疗健康,提升效率与便利性。然而,数据安全、设备兼容性及网络基础设施仍是挑战。随着5G和AI进步,IoT将在更多领域发挥潜力,驱动社会智能化转型,需关注技术挑战并加强创新。
1455 4
|
JSON Java 应用服务中间件