广告
返回顶部
首页 > 资讯 > 精选 >Entity Framework中怎么使用Code First模式管理视图
  • 262
分享到

Entity Framework中怎么使用Code First模式管理视图

2023-06-29 09:06:55 262人浏览 泡泡鱼
摘要

今天小编给大家分享一下Entity Framework中怎么使用Code First模式管理视图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章

今天小编给大家分享一下Entity Framework中怎么使用Code First模式管理视图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、什么是视图

视图在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视图,见下图:

Entity Framework中怎么使用Code First模式管理视图

运行结果如下图:

Entity Framework中怎么使用Code First模式管理视图

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

Entity Framework中怎么使用Code First模式管理视图

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

以上就是“Entity Framework中怎么使用Code First模式管理视图”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Entity Framework中怎么使用Code First模式管理视图

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

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

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

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

下载Word文档
猜你喜欢
  • Entity Framework中怎么使用Code First模式管理视图
    今天小编给大家分享一下Entity Framework中怎么使用Code First模式管理视图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章...
    99+
    2023-06-29
  • Entity Framework怎么使用Code First模式管理事务
    今天小编给大家分享一下Entity Framework怎么使用Code First模式管理事务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后...
    99+
    2023-06-29
  • Entity Framework怎么使用Code First模式管理存储过程
    这篇文章主要介绍“Entity Framework怎么使用Code First模式管理存储过程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Entity Framewo...
    99+
    2023-06-29
  • Entity Framework如何使用Code First模式管理数据库
    这篇文章主要为大家展示了“Entity Framework如何使用Code First模式管理数据库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Entity Fr...
    99+
    2023-06-29
  • EF中怎么使用Code First模式生成单数形式表名
    今天小编给大家分享一下EF中怎么使用Code First模式生成单数形式表名的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • EF中怎么使用Code First模式给实体类添加复合主键
    这篇文章主要介绍“EF中怎么使用Code First模式给实体类添加复合主键”,在日常操作中,相信很多人在EF中怎么使用Code First模式给实体类添加复合主键问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作