博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework Core Raw Query再叙注意事项后续
阅读量:6764 次
发布时间:2019-06-26

本文共 2276 字,大约阅读时间需要 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 DbSet
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
BlogViewModels { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.AddEntityConfigurationsFromAssembly(GetType().GetTypeInfo().Assembly); modelBuilder.Ignore
(); } }

 

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

总结

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

转载地址:http://jideo.baihongyu.com/

你可能感兴趣的文章
【Opencv学习】摄像头采集、录像、截图小工具
查看>>
Fedora16安装中文语言包和中文输入法
查看>>
Windows 8实用窍门系列:14.windows 8中粘贴板(剪切板)的使用
查看>>
长连接API小心“窜包”问题
查看>>
开发者基础知识游戏,共10关,欢迎挑战
查看>>
ASP.NET中 RadioButtonList(单选按钮组)的使用
查看>>
SESSION 丢失
查看>>
DES可逆加解密
查看>>
图解Undo原理
查看>>
Kinect for Windows SDK V1.7 发布
查看>>
JAVA中的参数按值传递与按引用传递
查看>>
与Recommender System相关的会议及期刊
查看>>
如何理解ip路由和操作linux的路由表
查看>>
WCF的几种寄宿方式 ( 转)
查看>>
数字数据fzu 2120 数字排列
查看>>
ORACLE 数据库 SQL 转换 只取 年和月
查看>>
区间查询[2009国家集训队]小Z的袜子(hose)
查看>>
Android之使用微信开放api (三)---注册与反注册应用到微信
查看>>
我是怎样看待微博的
查看>>
论《我是如何安慰女友的》
查看>>