91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

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

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

一、什么是視圖

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

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

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

1、創建實體類

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、創建模擬視圖類

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

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

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

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

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代碼時很有用。 

5、創建數據上下文類

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

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;

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

            Console.ReadKey();
        }
    }
}

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

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

運行結果如下圖:

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

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

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

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

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

向AI問一下細節

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

AI

永顺县| 梨树县| 蕉岭县| 门源| 新郑市| 马公市| 宜州市| 铜川市| 二连浩特市| 呼和浩特市| 象州县| 阜阳市| 阜宁县| 南汇区| 台州市| 循化| 太原市| 巫山县| 庆阳市| 晋江市| 晋宁县| 高平市| 句容市| 益阳市| 花垣县| 林周县| 万源市| 固原市| 和硕县| 积石山| 武陟县| 万年县| 城口县| 玉环县| 宣武区| 淳化县| 宁武县| 屯昌县| 京山县| 多伦县| 英山县|