日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第六节:框架搭建之EF的Fluent Api模式的使用流程

發(fā)布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六节:框架搭建之EF的Fluent Api模式的使用流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 前言

  沉寂了約一個月的時間,今天用一篇簡單的文章重新回歸博客,主要來探討一下Fluent Api模式在實際項目中的使用流程。

1.?Fluent API屬于EF CodeFirst模式的一種,EF還有一種模式是DataAnnotations,兩種模式各有千秋吧,前面的EF系列已經(jīng)詳細介紹過他們的使用了,本節(jié)主要介紹 Fluent API模式在實際框架中的使用流程.

本節(jié)需要用到的技術(shù)有:

  ①:EF的三種模式(四) 之 原生正宗的 CodeFirst模式的默認約定? ?
  ②:EF的CodeFirst模式通過DataAnnotations修改默認協(xié)定
  ③:EF的CodeFirst模式通過Fluent API修改默認協(xié)定?
  ④:EF的CodeFirst模式的四種初始化策略和通過Migration進行數(shù)據(jù)的遷移

2. 框架模式
  這里不采用傳統(tǒng)的三層架構(gòu)(DAL、BLL),而是使用:Ypf.DTO、Ypf.Service、Ypf.IService、Ypf.Utils、Ypf.Web 這種劃分模式,本節(jié)為了方便測試,僅僅使用 Ypf.Service 和 Ypf.Test(控制臺)兩個框架進行測試。

3. 業(yè)務(wù)模擬
  ①. 用戶基本信息和角色基本信息,不做關(guān)聯(lián)
  ②. 用戶信息增加了或者刪除
  ③. 角色信息刪除了或者增加

?

二. 使用步驟

1.? 新建【Ypf.Service】類庫和【Ypf.Test】控制臺項目,并分別通過Nuget安裝EF程序集。

2. 在【Ypf.Service】類庫中新建“UserInfor”、“RoleInfor”實體類,“UserInforConfig”、“RoleInforConfig”實體類對應(yīng)的隔離出來的表的配置文件。

PS:這里為了方便管理,一張表對應(yīng)一個EF的配置類文件,比全部直接寫在?OnModelCreating 方法中更清晰。

分享實體類代碼:

1 /// <summary>2 /// 用戶表3 /// </summary>4 public class UserInfor5 {6 public string id { get; set; }8 public string userName { get; set; } 10 public int userAge { get; set; } 11 14 } 15 /// <summary> 16 /// 角色信息 17 /// </summary> 18 public class RoleInfor 19 { 20 public string id { get; set; } 22 public string roleName { get; set; } 24 public int roleAge { get; set; } 25 }

分享表配置文件代碼:

1 /// <summary>2 /// UserInfor實體對應(yīng)表的配置3 /// </summary>4 class UserInforConfig :EntityTypeConfiguration<UserInfor>5 {6 public UserInforConfig()7 {8 this.ToTable("T_UserInfor");9 this.HasKey<string>(u => u.id).Property(u => u.id).HasColumnType("varchar").HasMaxLength(32); 10 this.Property(u => u.userName).HasColumnType("varchar").HasMaxLength(50); 11 this.Property(u => u.userAge).HasColumnType("int").IsRequired(); 12 } 13 } 14 /// <summary> 15 /// RoleInfor實體對應(yīng)表的配置 16 /// </summary> 17 class RoleInforConfig : EntityTypeConfiguration<RoleInfor> 18 { 19 public RoleInforConfig() 20 { 21 this.ToTable("T_RoleInfor"); 22 this.HasKey<string>(u => u.id).Property(u => u.id).HasColumnType("varchar").HasMaxLength(32); 23 this.Property(u => u.roleName).HasColumnType("varchar").HasMaxLength(50); 24 this.Property(u => u.roleAge).HasColumnType("int").IsRequired(); 25 } 26 }

3. 在【Ypf.Service】類庫中新建EF上下文 “YpfContext”類,使用EF的默認初始化策略(DB不存在則創(chuàng)建,實體不對應(yīng)則報錯) ,然后override OnModelCreating方法,并通過反射一次性加載EF的所有Fluent Api配置,最后聲明要映射的實體。

?分享EF上下文的代碼

public class YpfContext:DbContext{/// <summary>/// 繼承父類構(gòu)造函數(shù),ypfConnectionString代表配置文件中連接字符串的名字/// </summary>public YpfContext():base("name=ypfConnectionString"){}/// <summary>/// OnModelCreating方法重寫,FluentAPI對表的配置都是在該方法中,但是當表數(shù)量多的話/// 該方法內(nèi)部就會顯得特別亂,所以我們這里采用分離的方式,一張表對應(yīng)一個配置文件類,/// 最后全部注冊到該方法中即可/// </summary>/// <param name="modelBuilder"></param>protected override void OnModelCreating(DbModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//1. 分開注冊//modelBuilder.Configurations.Add(new UserInforConfig());//modelBuilder.Configurations.Add(new RoleInforConfig());//2. 一次性加載所有Fluent API的配置modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());}public DbSet<UserInfor> UserInfor { get; set; }public DbSet<RoleInfor> RoleInfor { get; set; }}

4. 給【Ypf.Test】配置數(shù)據(jù)庫連接字符串,并且進行一個簡單的數(shù)據(jù)庫查詢操作,會發(fā)現(xiàn)在SQLServer默認目錄生成一個名為“FrameFluentApiDB”的數(shù)據(jù)庫,且表、字段對應(yīng)均正確。

?分享數(shù)據(jù)庫連接字符串代碼:

1 <connectionStrings> 2 <add name="ypfConnectionString" connectionString="Data Source=localhost;Initial Catalog=FrameFluentApiDB;User ID=sa;Password=123456" providerName="System.Data.SqlClient" /> 3 </connectionStrings>

分享簡單的數(shù)據(jù)庫查詢代碼:

1 class Program2 {3 static void Main(string[] args)4 {5 using (YpfContext db=new YpfContext())6 {7 var list = db.UserInfor.ToList();8 9 Console.WriteLine("創(chuàng)建成功"); 10 Console.ReadKey(); 11 } 12 } 13 }

?運行后生成的數(shù)據(jù)庫:

?

5. 給UserInfor實體增加一個“userSex”屬性,并在UserInforConfig文件中對該屬性進行配置,如下圖,再次運行代碼,報錯,提示上下文發(fā)生改變,請走數(shù)據(jù)遷移。

修改后代碼:

?

?

?

?

?

?

?

?

?

?

報錯提示:

PS:配置數(shù)據(jù)遷移策略固然可以解決該問題,但我們這里用一種比較笨的方法,關(guān)閉數(shù)據(jù)庫初始化策略,然后手動配置代碼和修改數(shù)據(jù)庫字段進行對應(yīng)即可。

?分享關(guān)閉數(shù)據(jù)庫初始化策略的代碼:

?

手動修改數(shù)據(jù)庫和代碼實體中的屬性對應(yīng)后重新運行代碼,運行成功。

?

?

?

?

!

  • 作???????者 :?Yaopengfei(姚鵬飛)
  • 博客地址 :?http://www.cnblogs.com/yaopengfei/
  • 聲?????明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲?????明2 : 原創(chuàng)博客請在轉(zhuǎn)載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權(quán)利。

總結(jié)

以上是生活随笔為你收集整理的第六节:框架搭建之EF的Fluent Api模式的使用流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。