博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework应用:使用Code First模式管理视图
阅读量:4654 次
发布时间:2019-06-09

本文共 7550 字,大约阅读时间需要 25 分钟。

一、什么是视图

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

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

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

1、创建实体类

BookType实体类定义如下:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 namespace CodeFirstViewApp.Model 8 { 9     public class BookType10     {11         public BookType()12         {13             Books = new HashSet
();14 }15 16 public int BookTypeId { get; set; }17 18 public string BookTypeName { get; set; }19 20 public virtual ICollection
Books { get; set; }21 }22 }

 Book实体类定义如下:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 namespace CodeFirstViewApp.Model 8 { 9    public  class Book10     {11         public int Id { get; set; }12 13         public string Name { get; set; }14 15         public string Author { get; set; }16 17         public DateTime PublicationDate { get; set; }18 19         public virtual BookType BookType { get; set; }20     }21 }

 2、创建模拟视图类

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

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 namespace CodeFirstViewApp.Model 8 { 9    public class BookView10     {11        public int BookId { get; set; }12 13        public string BookName { get; set; }14 15        public string Author { get; set; }16 17        public DateTime PublicationDate { get; set; }18 19        public string BookTypeName { get; set; }20     }21 }

 

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

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

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

1 using CodeFirstViewApp.Model; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Entity.ModelConfiguration; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8  9 namespace CodeFirstViewApp.Map10 {11     /// 12     /// 定义配置伙伴类13     /// 14     public class BookViewMap : EntityTypeConfiguration
15 {16 public BookViewMap()17 {18 // 设置表名19 this.ToTable("BookViews");20 // 设置主键21 HasKey(p => p.BookId);22 }23 }24 }

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

1 using CodeFirstViewApp.Model; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Entity; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8  9 namespace CodeFirstViewApp.EF10 {11     public class Initializer :DropCreateDatabaseAlways
12 { 13 ///
14 /// 重新Seed方法15 /// 16 ///
17 protected override void Seed(EFDbContext context)18 {19 // 创建初始化数据20 BookType bookType = new BookType()21 {22 BookTypeName = "文学小说",23 Books = new List
24 {25 new Book(){Name="人间失格",Author="太宰治",PublicationDate=DateTime.Parse("2015-08-01")},26 new Book(){Name="解忧杂货店",Author="东野圭吾",PublicationDate=DateTime.Parse("2014-05-01")},27 new Book(){Name="追风筝的人",Author="卡勒德胡赛尼",PublicationDate=DateTime.Parse("2006-08-01")},28 new Book(){Name="百年孤独",Author="加西亚马尔克斯",PublicationDate=DateTime.Parse("2011-06-01")},29 new Book(){Name="霍乱时期的爱情",Author="加西亚马尔克斯",PublicationDate=DateTime.Parse("2015-06-01")}30 }31 };32 33 BookType bookType2 = new BookType()34 {35 BookTypeName = "科学",36 Books = new List
37 {38 new Book(){Name="人类简史",Author="尤瓦尔赫拉利",PublicationDate=DateTime.Parse("2017-01-01")}39 }40 };41 42 context.BookTypes.Add(bookType);43 context.BookTypes.Add(bookType2);44 45 // 先删除表46 var drop = "Drop Table BookViews";47 context.Database.ExecuteSqlCommand(drop);48 49 // 创建视图50 var createView = @"CREATE VIEW [dbo].[BookViews]51 AS SELECT52 dbo.Books.Id AS BookId,53 dbo.Books.Name AS BookName,54 dbo.Books.Author AS Author,55 dbo.Books.PublicationDate AS PublicationDate,56 dbo.BookTypes.BookTypeName AS BookTypeName57 FROM dbo.Books58 INNER JOIN dbo.BookTypes ON dbo.BookTypes.BookTypeId=dbo.Books.BookTypeId";59 context.Database.ExecuteSqlCommand(createView);60 base.Seed(context);61 }62 }63 }

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

5、创建数据上下文类

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

1 using CodeFirstViewApp.Map; 2 using CodeFirstViewApp.Model; 3 using System; 4 using System.Collections.Generic; 5 using System.Data.Entity; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace CodeFirstViewApp.EF11 {12     public class EFDbContext:DbContext13     {14         public EFDbContext()15             : base("name=AppConnection")16         {17             Database.SetInitializer(new Initializer());18         }19 20         // 添加到数据上下文中21         public DbSet
Books { get; set; }22 23 public DbSet
BookTypes { get; set; }24 25 public DbSet
BookViews { get; set; }26 27 protected override void OnModelCreating(DbModelBuilder modelBuilder)28 {29 // 配置表名和主键30 modelBuilder.Entity
().ToTable("Books").HasKey(p => p.Id);31 modelBuilder.Entity
().ToTable("BookTypes").HasKey(p => p.BookTypeId);32 // 设置实体关系33 // BookType和 Books 一对多关系 外键:BookTypeId34 modelBuilder.Entity
().HasMany(p => p.Books).WithRequired(t => t.BookType)35 .Map(m => 36 {37 m.MapKey("BookTypeId");38 });39 40 // 添加配置伙伴类41 modelBuilder.Configurations.Add(new BookViewMap());42 base.OnModelCreating(modelBuilder);43 }44 }45 }

 6、运行程序

Main()方法定义如下:

1 using CodeFirstViewApp.EF; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7  8 namespace CodeFirstViewApp 9 {10     class Program11     {12         static void Main(string[] args)13         {14             using (var context = new EFDbContext())15             {16                 // 获取视图的数据17                 var bookView = context.BookViews;18 19                 // 循环遍历20                 bookView.ToList().ForEach(p => 21                 {22                     Console.WriteLine("Id:" + p.BookId + ",Name:" + p.BookName + ",BookTypeName;" + p.BookTypeName + ",PublicationDate:" + p.PublicationDate);23                 });24             }25 26             Console.ReadKey();27         }28     }29 }

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

运行结果如下图:

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

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

示例代码下载地址:https://pan.baidu.com/s/1gf2FzDD

转载于:https://www.cnblogs.com/dotnet261010/p/8065719.html

你可能感兴趣的文章
man帮助的使用
查看>>
C++内存管理之unique_ptr
查看>>
Access 2010 应用基础 单元三:SQL查询
查看>>
Ubuntu12.04搭建Tomcat7.0
查看>>
Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS
查看>>
使用VMware安装CentOS7详请
查看>>
AES && DES加解密
查看>>
[Android实例] Activity之间数据传递与共享的几种途径(bitmap篇)
查看>>
C#用Microsoft.Office.Interop.Word进行Word转PDF的问题
查看>>
什么是极限开发?
查看>>
Recommender Systems
查看>>
阿里巴巴的零知识证明[转]摘自科学松鼠会,作者奥卡姆剃刀
查看>>
Oracle 行迁移和行链接
查看>>
c++ windows下计时
查看>>
No. three
查看>>
杂诗4
查看>>
打印出A到Z的所有字符,使用char和int转换
查看>>
怎么用js设置a标签点击链接改变当前颜色
查看>>
jQuery源码浅析
查看>>
前端学习笔记day05 第一个页面--header部分
查看>>