您好,登錄后才能下訂單哦!
今天小編給大家分享一下Entity Framework中怎么使用Code First模式管理視圖的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
視圖在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模式管理視圖”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。