溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Entity?Framework中怎么使用Code?First模式管理視圖

發(fā)布時間:2022-03-05 16:08:02 來源:億速云 閱讀:157 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Entity Framework中怎么使用Code First模式管理視圖的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、什么是視圖

視圖在RDBMS(關系型數(shù)據(jù)庫管理系統(tǒng))中扮演了一個重要的角色,它是將多個表的數(shù)據(jù)聯(lián)結成一種看起來像是一張表的結構,但是沒有提供持久化。因此,可以將視圖看成是一個原生表數(shù)據(jù)頂層的一個抽象。例如,我們可以使用視圖提供不同安全的級別,也可以簡化必須編寫的查詢,尤其是我們可以在代碼中的多個地方頻繁地訪問使用視圖定義的數(shù)據(jù)。EF Code First模式現(xiàn)在還不完全支持視圖,因此我們必須使用一種變通的方法。這種方法是:將視圖真正看成是一張表,讓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)建種子數(shù)據(jù)初始化器類

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

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

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

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());
        }

        // 添加到數(shù)據(jù)上下文中
        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())
            {
                // 獲取視圖的數(shù)據(jù)
                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();
        }
    }
}

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

Entity?Framework中怎么使用Code?First模式管理視圖

運行結果如下圖:

Entity?Framework中怎么使用Code?First模式管理視圖

直接在數(shù)據(jù)庫中查詢視圖:

Entity?Framework中怎么使用Code?First模式管理視圖

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

以上就是“Entity Framework中怎么使用Code First模式管理視圖”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI