<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
檢視在RDBMS(關係型資料庫管理系統)中扮演了一個重要的角色,它是將多個表的資料聯結成一種看起來像是一張表的結構,但是沒有提供持久化。因此,可以將檢視看成是一個原生表資料頂層的一個抽象。例如,我們可以使用檢視提供不同安全的級別,也可以簡化必須編寫的查詢,尤其是我們可以在程式碼中的多個地方頻繁地存取使用檢視定義的資料。EF Code First模式現在還不完全支援檢視,因此我們必須使用一種變通的方法。這種方法是:將檢視真正看成是一張表,讓EF定義這張表,然後在刪除它,最後再建立一個代替它的檢視。
以圖書和圖書型別為例講解如何使用EF的Code First模式管理檢視。
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; } } }
從多個實體中取出想要的列組合成一個實體,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; } } }
下面的程式碼指定了表名和主鍵。
注意:表名也是檢視的名字,這裡的表名一定要和建立檢視的語句中的檢視名一致。
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); } } }
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程式碼時很有用。
把實體類新增到資料上下文中,並設定實體之間的關係
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); } } }
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模式管理檢視的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45