zoukankan      html  css  js  c++  java
  • 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>(); 来忽略实体映射。

  • 相关阅读:
    css选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先
    移动端重要的几个CSS3属性设置
    关于移动端的Click事件
    JS根据key值获取URL中的参数值,以及把URL的参数转换成json对象
    动态添加JS文件到页面
    JS 模拟C# 字符串格式化操作
    JS cookie 读写操作
    很好用的Tab标签切换功能,延迟Tab切换。
    SpringMVC 原理
    SpringMVC 三种异常处理方式
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/6341442.html
Copyright © 2011-2022 走看看