欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Entity Framework使用Code First模式管理視圖

 更新時間:2022年03月05日 14:25:24   作者:.NET開發(fā)菜鳥  
本文詳細講解了Entity Framework使用Code First模式管理視圖的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、什么是視圖

視圖在RDBMS(關系型數據庫管理系統(tǒng))中扮演了一個重要的角色,它是將多個表的數據聯結成一種看起來像是一張表的結構,但是沒有提供持久化。因此,可以將視圖看成是一個原生表數據頂層的一個抽象。例如,我們可以使用視圖提供不同安全的級別,也可以簡化必須編寫的查詢,尤其是我們可以在代碼中的多個地方頻繁地訪問使用視圖定義的數據。EF Code First模式現在還不完全支持視圖,因此我們必須使用一種變通的方法。這種方法是:將視圖真正看成是一張表,讓EF定義這張表,然后在刪除它,最后再創(chuàng)建一個代替它的視圖。

二、使用EF的Code First模式管理視圖

以圖書和圖書類型為例講解如何使用EF的Code First模式管理視圖。

1、創(chuàng)建實體類

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、創(chuàng)建模擬視圖類

從多個實體中取出想要的列組合成一個實體,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、為模擬視圖類創(chuàng)建配置伙伴類

下面的代碼指定了表名和主鍵。

注意:表名也是視圖的名字,這里的表名一定要和創(chuàng)建視圖的語句中的視圖名一致。

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、創(chuàng)建種子數據初始化器類

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)
        {
            // 創(chuàng)建初始化數據
            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);

            // 創(chuàng)建視圖
            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()方法銷毀生成的表,然后又調用該方法創(chuàng)建我們需要的視圖。該方法在允許開發(fā)者對后端執(zhí)行任意的SQL代碼時很有用。 

5、創(chuàng)建數據上下文類

把實體類添加到數據上下文中,并配置實體之間的關系

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;

                // 循環(huán)遍歷
                bookView.ToList().ForEach(p =>
                {
                    Console.WriteLine("Id:" + p.BookId + ",Name:" + p.BookName + ",BookTypeName;" + p.BookTypeName + ",PublicationDate:" + p.PublicationDate);
                });
            }

            Console.ReadKey();
        }
    }
}

 運行程序,就會看到數據庫中已經生成了Books和BookTypes兩張表和BookViews視圖,見下圖:

運行結果如下圖:

直接在數據庫中查詢視圖:

注意:訪問視圖和任意數據表在代碼層面沒有任何區(qū)別,需要注意的地方就是在Seed()方法中定義的視圖名稱要和定義的表名一致,否則就會因為找不到表對象而報錯。

示例代碼下載地址:點此下載

到此這篇關于Entity Framework使用Code First模式管理視圖的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論