广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >EntityFramework使用CodeFirst模式管理视图
  • 930
分享到

EntityFramework使用CodeFirst模式管理视图

2024-04-02 19:04:59 930人浏览 薄情痞子
摘要

一、什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化。因此,可以将视图看成是一个原生

一、什么是视图

视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化。因此,可以将视图看成是一个原生表数据顶层的一个抽象。例如,我们可以使用视图提供不同安全的级别,也可以简化必须编写的查询,尤其是我们可以在代码中的多个地方频繁地访问使用视图定义的数据。EF Code First模式现在还不完全支持视图,因此我们必须使用一种变通的方法。这种方法是:将视图真正看成是一张表,让EF定义这张表,然后在删除它,最后再创建一个代替它的视图。

二、使用EF的Code First模式管理视图

以图书和图书类型为例讲解如何使用EF的Code First模式管理视图。

1、创建实体类

BookType实体类定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp.Model
{
    public class BookType
    {
        public BookType()
        {
            Books = new HashSet<Book>();
        }

        public int BookTypeId { get; set; }

        public string BookTypeName { get; set; }

        public virtual ICollection<Book> Books { get; set; }
    }
}

 Book实体类定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp.Model
{
   public  class Book
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Author { get; set; }

        public DateTime PublicationDate { get; set; }

        public virtual BookType BookType { get; set; }
    }
}

 2、创建模拟视图类

从多个实体中取出想要的列组合成一个实体,BookView模拟视图类定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp.Model
{
   public class BookView
    {
       public int BookId { get; set; }

       public string BookName { get; set; }

       public string Author { get; set; }

       public DateTime PublicationDate { get; set; }

       public string BookTypeName { get; set; }
    }
}

3、为模拟视图类创建配置伙伴类

下面的代码指定了表名和主键。

注意:表名也是视图的名字,这里的表名一定要和创建视图的语句中的视图名一致。

using CodeFirstViewApp.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp.Map
{
    /// <summary>
    /// 定义配置伙伴类
    /// </summary>
    public class BookViewMap : EntityTypeConfiguration<BookView>
    {
        public BookViewMap()
        {
            // 设置表名
            this.ToTable("BookViews");
            // 设置主键
            HasKey(p => p.BookId);
        }
    }
}

 4、创建种子数据初始化器类

using CodeFirstViewApp.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp.EF
{
    public class Initializer :DropCreateDatabaseAlways<EFDbContext>
    {
        /// <summary>
        /// 重新Seed方法
        /// </summary>
        /// <param name="context"></param>
        protected override void Seed(EFDbContext context)
        {
            // 创建初始化数据
            BookType bookType = new BookType()
            {
                BookTypeName = "文学小说",
                Books = new List<Book>
                {
                  new Book(){Name="人间失格",Author="太宰治",PublicationDate=DateTime.Parse("2015-08-01")},
                  new Book(){Name="解忧杂货店",Author="东野圭吾",PublicationDate=DateTime.Parse("2014-05-01")},
                  new Book(){Name="追风筝的人",Author="卡勒德胡赛尼",PublicationDate=DateTime.Parse("2006-08-01")},
                  new Book(){Name="百年孤独",Author="加西亚马尔克斯",PublicationDate=DateTime.Parse("2011-06-01")},
                  new Book(){Name="霍乱时期的爱情",Author="加西亚马尔克斯",PublicationDate=DateTime.Parse("2015-06-01")}
                }
            };

            BookType bookType2 = new BookType()
            {
                BookTypeName = "科学",
                Books = new List<Book>
                {
                   new Book(){Name="人类简史",Author="尤瓦尔赫拉利",PublicationDate=DateTime.Parse("2017-01-01")}
                }
            };

            context.BookTypes.Add(bookType);
            context.BookTypes.Add(bookType2);

            // 先删除表
            var drop = "Drop Table BookViews";
            context.Database.ExecutesqlCommand(drop);

            // 创建视图
            var createView = @"CREATE VIEW [dbo].[BookViews]
                             AS SELECT
                             dbo.Books.Id AS BookId,
                             dbo.Books.Name AS BookName,
                             dbo.Books.Author AS Author,
                             dbo.Books.PublicationDate AS PublicationDate,
                             dbo.BookTypes.BookTypeName AS  BookTypeName
                             FROM dbo.Books
                             INNER JOIN dbo.BookTypes ON dbo.BookTypes.BookTypeId=dbo.Books.BookTypeId";
            context.Database.ExecuteSqlCommand(createView);
            base.Seed(context);
        }
    }
}

上面的代码中,我们先使用Database对象的ExecuteSqlCommand()方法销毁生成的表,然后又调用该方法创建我们需要的视图。该方法在允许开发者对后端执行任意的SQL代码时很有用。 

5、创建数据上下文类

把实体类添加到数据上下文中,并配置实体之间的关系

using CodeFirstViewApp.Map;
using CodeFirstViewApp.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp.EF
{
    public class EFDbContext:DbContext
    {
        public EFDbContext()
            : base("name=AppConnection")
        {
            Database.SetInitializer(new Initializer());
        }

        // 添加到数据上下文中
        public DbSet<Book> Books { get; set; }

        public DbSet<BookType> BookTypes { get; set; }

        public DbSet<BookView> BookViews { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // 配置表名和主键
            modelBuilder.Entity<Book>().ToTable("Books").HasKey(p => p.Id);
            modelBuilder.Entity<BookType>().ToTable("BookTypes").HasKey(p => p.BookTypeId);
            // 设置实体关系
            //  BookType和 Books 一对多关系 外键:BookTypeId
            modelBuilder.Entity<BookType>().HasMany(p => p.Books).WithRequired(t => t.BookType)
                .Map(m =>
                {
                    m.MapKey("BookTypeId");
                });

            // 添加配置伙伴类
            modelBuilder.Configurations.Add(new BookViewMap());
            base.OnModelCreating(modelBuilder);
        }
    }
}

 6、运行程序

Main()方法定义如下:

using CodeFirstViewApp.EF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirstViewApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new EFDbContext())
            {
                // 获取视图的数据
                var bookView = context.BookViews;

                // 循环遍历
                bookView.ToList().ForEach(p =>
                {
                    Console.WriteLine("Id:" + p.BookId + ",Name:" + p.BookName + ",BookTypeName;" + p.BookTypeName + ",PublicationDate:" + p.PublicationDate);
                });
            }

            Console.ReadKey();
        }
    }
}

 运行程序,就会看到数据库中已经生成了Books和BookTypes两张表和BookViews视图,见下图:

运行结果如下图:

直接在数据库中查询视图:

注意:访问视图和任意数据表在代码层面没有任何区别,需要注意的地方就是在Seed()方法中定义的视图名称要和定义的表名一致,否则就会因为找不到表对象而报错。

示例代码下载地址:点此下载

到此这篇关于Entity Framework使用Code First模式管理视图的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: EntityFramework使用CodeFirst模式管理视图

本文链接: https://www.lsjlt.com/news/141415.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • EntityFramework使用CodeFirst模式管理视图
    一、什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化。因此,可以将视图看成是一个原生...
    99+
    2022-11-13
  • EntityFramework使用CodeFirst模式管理事务
    一、什么是事务 处理以数据为中心的应用时,另一个重要的话题是事务管理。ADO.NET为事务管理提供了一个非常干净和有效的API。因为EF运行在ADO.NET之上,所以EF可以使用AD...
    99+
    2022-11-13
  • EntityFramework使用CodeFirst模式管理数据库
    一、管理数据库连接 1、使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会...
    99+
    2022-11-13
  • EntityFramework使用CodeFirst模式管理存储过程
    在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:SqlQuery和ExecuteSqlCommand。为了从存储过程中读取很多数据行,我们只需要...
    99+
    2022-11-13
  • SQL Server的视图模式管理
    概述SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Mi...
    99+
    2022-10-18
  • Entity Framework中怎么使用Code First模式管理视图
    今天小编给大家分享一下Entity Framework中怎么使用Code First模式管理视图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章...
    99+
    2023-06-29
  • 视图模式及T-SQL语句操作管理SQL Server数据库
    关于SQL Server数据库相关理论概念请参考:SQL Server数据库、表、数据类型基本概念 一、视图模式管理表 SQL Server对数据库的操作有两种方式,即可视化操作界面和SQL语言。下面介绍在...
    99+
    2022-10-18
  • vue使用Vuex状态管理模式
    目录1、基于单向数据流问题而产生了Vuex2、安装及使用3、核心及使用方法(1)State(2) Getters(3) Mutation(4) Action(5)Modules4、V...
    99+
    2022-11-13
  • vue怎么使用Vuex状态管理模式
    这篇“vue怎么使用Vuex状态管理模式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么使用Vuex状态管理模式”文...
    99+
    2023-06-29
  • Entity Framework怎么使用Code First模式管理事务
    今天小编给大家分享一下Entity Framework怎么使用Code First模式管理事务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后...
    99+
    2023-06-29
  • 数据库中如何使用数据字典视图管理对象
    小编给大家分享一下数据库中如何使用数据字典视图管理对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 一、数据字典的分类 1...
    99+
    2022-10-18
  • Entity Framework如何使用Code First模式管理数据库
    这篇文章主要为大家展示了“Entity Framework如何使用Code First模式管理数据库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Entity Fr...
    99+
    2023-06-29
  • Win8.1使用技巧之电源模式管理优化指南
      电源优化管理有何优点?   电源管理的优化,能维护电脑稳定运行,降低设备各部件功耗,节省用电开销,延长设备电池及各部件的使用寿命,使设备能够长久保持稳定、低能耗、高性能的运 行状态。由于以往的Windo...
    99+
    2022-06-04
    使用技巧 电源 模式
  • Entity Framework怎么使用Code First模式管理存储过程
    这篇文章主要介绍“Entity Framework怎么使用Code First模式管理存储过程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Entity Framewo...
    99+
    2023-06-29
  • 如何使用 Windows Copilot 打开暗模式、免打扰、管理蓝牙设备等
    对于任何想尽早了解Windows上AI未来的人来说,不再需要查看Copilot预览。Copilot的功能虽然有限,看起来只是一个侧边的Bing AI任务栏,但毫无疑问它是朝着正确的方向迈进的推动力量。即使是现在,用户也可以在浅色和深色主题之...
    99+
    2023-08-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作