国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Code First 之類繼承

2019-11-17 02:57:25
字體:
供稿:網(wǎng)友

Code First 之類繼承

關(guān)于Entity Framework 的code first 模式,相信大家都不陌生了.本文就來看看實(shí)體繼承在 codefirst里的用法.

第一步 添加 code first 的環(huán)境

這里為了方便,選用的是 VS2013 + SQL SERVER 2014 LocalDb, 查看數(shù)據(jù)用 SQL Server Management Studio 2014

工程我們選用最簡單的控制臺(tái).

新建完成控制臺(tái)項(xiàng)目(這里以 EF_CodeFirst_Test 命名)以后,添加 EF 的庫,可以用NuGet 的界面添加,也可以用命令,這里用命令添加

在程序包管理器控制臺(tái)(工具 –> NuGet程序包管理器 –> 程序包管理器控制臺(tái)) 輸入

Install-Package EntityFramework EF_CodeFirst_Test#換上你自己的項(xiàng)目名

接下來,在app.config里加入連接字符串

<add name="CodeFirstModel" connectionString="data source=(LocalDb)/MSSQLLocalDb;initial catalog=TestDb;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework" 數(shù)據(jù)庫  -->

第二步 編寫實(shí)體類

基類型

public class BaseClass{        public long ID { get; set; }        public string Name { get; set; }}

三個(gè)擴(kuò)展類,這里為了合并一些表字段,加入了 注解,不然EF會(huì)把不同子類里的同名字段后面加上1 2 3 等的數(shù)字來區(qū)分.加入注解可以強(qiáng)制不同的子類在相同的類型下使用同一字段.

注解相關(guān)的命名空間如下

using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;

這里要說明一下,在.net 4.5中 Schema里的一些字段放到了自帶的類庫里,而在.net 4 及.net 3.5 里是沒有的,如果你用一個(gè)版本建立了項(xiàng)目,又切換了.net 版本,記得重新安裝EF,以保證不要出現(xiàn)同一個(gè)類在兩個(gè)庫中同時(shí)出現(xiàn)導(dǎo)致無法編譯.

下面是幾個(gè)擴(kuò)展類

public class ExtendClass:BaseClass{        public string DescriptionString { get; set; }        [Required]        [Column("LongNum")]        public long LongNum { get; set; }}public class ExtendClass2 : BaseClass{        [Column("Version")]        public string Version { get; set; }        [Required]        [Column("IntNum")]        public int IntNum { get; set; }}public class ExtendClass3 : BaseClass{        [Column("Version")]        public string Version { get; set; }        [Required]        [Column("IntNum")]        public int IntNum { get; set; }        [Required]        [Column("LongNum")]        public long LongNum { get; set; }}

最后是數(shù)據(jù)庫上下文

public partial class CodeFirstModel : DbContext{        public CodeFirstModel()            : base("name=CodeFirstModel")        {        }        public virtual DbSet<ExtendClass> ExtendClass { get; set; }        public virtual DbSet<BaseClass> BaseClass { get; set; }        public virtual DbSet<ExtendClass2> ExtendClass2 { get; set; }        public virtual DbSet<ExtendClass3> ExtendClass3 { get; set; }}

第三步 開始嘗試—>建數(shù)據(jù)庫

在Main函數(shù)里加入下面代碼并執(zhí)行

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CodeFirstModel>());using (var context = new CodeFirstModel()){    context.Database.Initialize(true);}

然后我們可以在 SQL Server Management Studio 里看到數(shù)據(jù)庫,并且還有兩個(gè)表

codefirst_1

從這張表上不難看出,在同一個(gè)基類下面繼承出的不同實(shí)體, code first 會(huì)為我們創(chuàng)建同一張表來存儲(chǔ)他們.第一個(gè)表是code first 的工作表,僅與模型的更新有關(guān).第二個(gè)表者是真正的實(shí)體表.

讓我們看看這個(gè)表的構(gòu)成.

codefirst_2

我們會(huì)發(fā)現(xiàn),所有的子類的字段都在這里,因?yàn)槲覀冇米⒔夂喜⒘艘恍?shù)據(jù)字段,不然同名的字段會(huì)出現(xiàn)多個(gè),并且后面補(bǔ)1,2,3 這些數(shù)字來區(qū)分.

子類中雖然我們在字段上標(biāo)了[Required],但是表中的字段仍然是可空的.不能想到,因?yàn)樵谶@個(gè)實(shí)體里是必須的,但是其它的子類里就不一定了,所以,只有其類的[Required]標(biāo)注會(huì)讓EF 創(chuàng)建一個(gè)not null的字段.

第四步 存一點(diǎn)數(shù)據(jù)看看吧

在Main 函數(shù)里插入點(diǎn)數(shù)據(jù)吧

using(CodeFirstModel db = new CodeFirstModel()) {    BaseClass bc = new BaseClass { Name = "" };                db.BaseClass.Add(bc);                ExtendClass bc1= new ExtendClass() { Name = "王二", DescriptionString = "麻子" };                db.ExtendClass.Add(bc1);                ExtendClass2 bc2 = new ExtendClass2 { Name = "Sqlserver", Version = "2014" };                db.ExtendClass2.Add(bc2);        db.SaveChanges();}

我們再來看看數(shù)據(jù)庫里的數(shù)據(jù)

codefirst_3

好的,都存進(jìn)去了,讓我們試試往基類的實(shí)體集里插入子類實(shí)體

修改Main 函數(shù)里添加的部分代碼

using(CodeFirstModel db = new CodeFirstModel()) {                //BaseClass bc = new BaseClass { Name = "" };                //db.BaseClass.Add(bc);                //ExtendClass bc1= new ExtendClass() { Name = "王二", DescriptionString = "麻子" };                //db.ExtendClass.Add(bc1);                //ExtendClass2 bc2 = new ExtendClass2 { Name = "Sqlserver", Version = "2014" };                //db.ExtendClass2.Add(bc2);                ExtendClass3 bc3 = new ExtendClass3 { Name = "C3", Version = "9981", IntNum = 3000, LongNum = 0xFFFFFFFFFFL };                db.BaseClass.Add(bc3);                db.SaveChanges();}

執(zhí)行后查看數(shù)據(jù)庫

codefirst_4

然后我們發(fā)現(xiàn),往基類的實(shí)體集里插子類實(shí)體,跟往子類的實(shí)體集中插入是一樣的.

第五步 讀點(diǎn)數(shù)據(jù)吧

修改Main 函數(shù)與實(shí)體操作相關(guān)部分

using(CodeFirstModel db = new CodeFirstModel()){                //BaseClass bc = new BaseClass { Name = "" };                //db.BaseClass.Add(bc);                //ExtendClass bc1= new ExtendClass() { Name = "王二", DescriptionString = "麻子" };                //db.ExtendClass.Add(bc1);                //ExtendClass2 bc2 = new ExtendClass2 { Name = "Sqlserver", Version = "2014" };                //db.ExtendClass2.Add(bc2);                //ExtendClass3 bc3 = new ExtendClass3 { Name = "C3", Version = "9981", IntNum = 3000, LongNum = 0xFFFFFFFFFFL };                //db.BaseClass.Add(bc3);                //db.SaveChanges();                foreach (var item in db.BaseClass)                {                    var cbc3 = item as ExtendClass3;                    if (cbc3 != null)                    {                        Console.Write(cbc3.ID);                        Console.Write(":/t");                        Console.WriteLine(cbc3.Name);                    }                }                }

我們可以看到執(zhí)行的結(jié)果

codefirst_5

看到了吧,從基類的實(shí)體集里讀到的,實(shí)際上是子類實(shí)體.是可以向下轉(zhuǎn)型到對應(yīng)的子類的.當(dāng)然,向上轉(zhuǎn)型就不說了.

小結(jié)

Entity Framework 的 codefirst 模式讓我們可以把數(shù)據(jù)庫中的實(shí)體當(dāng)成是本地的實(shí)體來用.無疑,這讓我們的代碼有了更大的靈活性.但是同時(shí),也讓數(shù)據(jù)庫看起來不那么友好了,因?yàn)槔锩娑嗔藢?shí)體映射的字段.

ORM框架在一定程度上屏蔽了數(shù)據(jù)庫的差異,但同時(shí)也屏蔽了一些數(shù)據(jù)庫的優(yōu)勢.而codefirst 更是讓一些復(fù)雜的數(shù)據(jù)切分及用存儲(chǔ)過程加速處理變得不那么友好了.引用一句老話,不要為了做IT為做IT,當(dāng)我們的ORM無法快速的達(dá)到我們預(yù)期的目的時(shí),不妨把ORM 拿掉,用最原始的驅(qū)動(dòng)加上手寫的SQL和存儲(chǔ)過程來做應(yīng)用.


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 措美县| 罗甸县| 新民市| 乐山市| 枣强县| 库伦旗| 海晏县| 台山市| 巴林左旗| 大竹县| 稷山县| 邹城市| 呼和浩特市| 汕尾市| 定边县| 河西区| 南郑县| 牡丹江市| 宁津县| 大新县| 贵州省| 双柏县| 南开区| 肥西县| 红河县| 临邑县| 夹江县| 任丘市| 神木县| 岐山县| 镇原县| 策勒县| 贡山| 通州区| 陆河县| 巴里| 长垣县| 鄱阳县| 应城市| 德令哈市| 黑龙江省|