日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 蜜桃精品视频在线 | 欧美午夜精品久久久久久人妖 | 欧美在线xxx| 天堂中文在线观看 | 91视频免费看 | 国产视频一区二区在线观看 | 激情视频一区二区三区 | 丰满熟妇人妻中文字幕 | 精品国产日本 | 亚洲片国产一区一级在线观看 | 欧美性另类 | 欧美精品一级二级 | 国产精品一区二区久久久 | 九色porn蝌蚪 | 午夜黄色网址 | 91超碰在线观看 | 成人av社区| 伊人成人动漫 | 四虎影库永久在线 | 欧美高清视频一区二区 | www.黄色在线观看 | 91视频免费网址 | 尤物在线视频观看 | 在线免费看av | 日本不卡一区在线观看 | 欧美国产在线观看 | 各种含道具高h调教1v1男男 | 精品久久久噜噜噜久久久 | 国产精品扒开腿做爽爽 | 成人免费看片39 | 一个色在线 | 三级欧美韩日大片在线看 | 日韩激情成人 | 久久经典视频 | 中文在线观看高清视频 | 欧美91精品久久久久国产性生爱 | 成年人黄色免费视频 | 亚洲一区在线看 | 我们好看的2018视频在线观看 | 美女视频一区二区三区 | 免费成年人视频 | 在线免费a视频 | 人人干干| 国产成人精品123区免费视频 | av免费的| 在线国产欧美 | 亚洲永久av| 91丨porny丨国产入口 | 亚洲成人一区在线 | 欧美天天性| 在线观看成人 | 一区二区福利视频 | 国产偷人妻精品一区 | 中国女人黄色大片 | 亚洲第一在线播放 | 伊人久久青青草 | 免费日皮视频 | 精品欧美在线观看 | 91免费国产在线观看 | 日韩1页 | 亚洲精品av中文字幕在线在线 | 国产精品一区二区三区四区在线观看 | 亚洲av中文无码乱人伦在线视色 | 国产在线精品福利 | 97超碰资源总站 | 日日碰碰 | 欧美激情亚洲综合 | 欧美大片黄 | 婷婷综合激情 | 影音先锋国产在线 | 99综合在线 | 国产一级一片免费播放放a 丁香六月色 | 久久亚洲熟女cc98cm | 国内自拍第二页 | 日韩av在线看免费观看 | 高清视频免费在线观看 | 韩国日本欧美一区 | 国产一区免费看 | 免费se99se| 久久公开视频 | 99在线免费观看视频 | 奇米在线777 | 国产二区免费 | 性久久| 亚洲天堂福利视频 | 久久精品毛片 | 每日av更新 | 精品人妻伦一区二区三区久久 | 1000部啪啪未满十八勿入 | 超碰www| 麻豆影视av | 波多野结衣 久久 | 91成人入口| 理论片琪琪午夜电影 | 中文字幕免费高清 | 欧洲女性下面有没有毛发 | 波多野结衣乳巨码无在线观看 | 久久综合激情 | 91在线观看喷潮 |