
EntityFramework Core Raw Query再叙注意事项后续
发布日期:2021-05-08 23:22:48
浏览次数:18
分类:博客文章
本文共 2261 字,大约阅读时间需要 7 分钟。
前言
话说通过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{ BlogViewModel GetBlog(int BlogId); }
接着我们实现其接口
public BlogViewModel GetBlog(int BlogId) { var sql = @"SELECT Name, Url, Content, TitleFROM dbo.Blog INNER JOIN dbo.Post ON dbo.Post.BlogId = dbo.Blog.IdWHERE dbo.Blog.Id = {0}"; var blogSingle = _efCoreContext.Set().FromSql(sql, BlogId); return blogSingle.ToList().FirstOrDefault(); }
然后为了在上下文中跟踪到ViewModel所以我们在上下文中进行如下定义
public class EFCoreContext : DbContext { public EFCoreContext(DbContextOptions options) : base(options) { } public DbSetBlogViewModels { 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 DbSetBlogViewModels { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.AddEntityConfigurationsFromAssembly(GetType().GetTypeInfo().Assembly); modelBuilder.Ignore (); } }
到这里我们本节的话题才算结束。
总结
我们再来对EF中使用原始查询做个最终总结,我们需要在上下文中定义ViewModel,但是我们不希望将其映射到表中,我们需要通过 modelBuilder.Ignore<ViewModel>(); 来忽略实体映射。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月29日 18时53分28秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++中找资源或者函数的方法
2021-05-09
delete对象时会自动调用类的析构函数
2021-05-09
POD类型
2021-05-09
const与常量,傻傻分不清楚~
2021-05-09
Head First设计模式——迭代器模式
2021-05-09
MongoDB版本及存储引擎区别
2021-05-09
shell echo单行和多行文字定向写入到文件中
2021-05-09
cmp命令
2021-05-09
Linux 磁盘管理(df fu fdisk mkfs mount)
2021-05-09
jQuery的事件绑定与触发 - 学习笔记
2021-05-09
Linux上TCP的几个内核参数调优
2021-05-09
记一次讲故事机器人的开发-我有故事,让机器人来读
2021-05-09
seo 回忆录百度基本概念(一)
2021-05-09
netcore中使用session
2021-05-09
Android 开发学习进程0.25 自定义控件
2021-05-09
多媒体文件格式全解说(下)--图片
2021-05-09
淘宝WAP版小BUG分析
2021-05-09
asp.net打印网页后自动关闭网页【无需插件】
2021-05-09
【Maven】POM基本概念
2021-05-09