在Code First模式中自動(dòng)創(chuàng)建Entity模型
之前我在博客文章中介紹過(guò)如何使用Code First來(lái)創(chuàng)建數(shù)據(jù)庫(kù),通過(guò)CodeFirst的方式,可以大幅的減少開(kāi)發(fā)人員的工作量,比傳統(tǒng)的先創(chuàng)建庫(kù)再ORM的方式簡(jiǎn)單了不少。但是,很多時(shí)候,特別是一些MIS系統(tǒng),我們會(huì)涉及到大量的實(shí)體類(lèi)型,類(lèi)似如下所示:
public class DbContext : System.Data.Entity.DbContext
{
public DbContext() : base("name=DefaultConnection")
{
}
public DbSet<Pencil> Penlils { get; set; }
public DbSet<Pen> Pens { get; set; }
public DbSet<Ink> Inks { get; set; }
public DbSet<Eraser> Erasers { get; set; }
//....
}在常用的CodeFirst方式下,每增加一種類(lèi)型就需要在DbContext中增加一個(gè)屬性。雖然并不算麻煩,但這種手動(dòng)維護(hù)的方式存在如下兩個(gè)問(wèn)題:
當(dāng)實(shí)體類(lèi)型較多且變更比較頻繁的的時(shí)候,靠手動(dòng)的方式維護(hù)實(shí)體列表很容易出錯(cuò)。
有的時(shí)候,客戶(hù)并不會(huì)買(mǎi)整套產(chǎn)品,只需要里面的部分模塊,手動(dòng)維護(hù)的方式不方便模塊的裁剪。
此時(shí),就需要我們來(lái)實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建實(shí)體模型了,Entity Framework中本身是支持動(dòng)態(tài)創(chuàng)建實(shí)體模型的,上面的實(shí)體模型就可以通過(guò)如下方式動(dòng)態(tài)創(chuàng)建:
public class DbContext : System.Data.Entity.DbContext
{
public DbContext() : base("name=DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Pencil>();
modelBuilder.Entity<Pen>();
modelBuilder.Entity<Ink>();
modelBuilder.Entity<Eraser>();
//....
}
}PS:修改成這樣的方式后,原來(lái)的代碼可能出現(xiàn)如下問(wèn)題:DbContext中沒(méi)有 Inks屬性了。此時(shí)只需要將原來(lái)的對(duì)db.Inks的訪問(wèn)換成 db.Set<Ink>即可
結(jié)果上述操作后,雖然我們實(shí)現(xiàn)了動(dòng)態(tài)創(chuàng)建,但實(shí)體類(lèi)型還是手動(dòng)添加的。因此我們還缺少一種實(shí)體類(lèi)型的發(fā)現(xiàn)機(jī)制,這種發(fā)現(xiàn)機(jī)制在.net中實(shí)現(xiàn)還是比較簡(jiǎn)單的,這里我采用的是Attribute的方式。
首先寫(xiě)一個(gè)Attribute,
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class PersistentAttribute : Attribute
{
}然后將需要自動(dòng)創(chuàng)建的實(shí)體用該Attribute標(biāo)記,
[Persistent]
public class Pen
[Persistent]
public class Ink最后,根據(jù)標(biāo)記的實(shí)體添加實(shí)體模型。
public class DbContext : System.Data.Entity.DbContext
{
public DbContext() : base("name=DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var assembly = this.GetType().Assembly;
var entityTypes = from type in assembly.GetTypes()
where type.GetCustomAttribute<PersistentAttribute>() != null
select type;
var entityMethod = typeof(DbModelBuilder).GetMethod("Entity");
foreach (var type in entityTypes)
{
entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { });
}
}
}通過(guò)上述方法,就可以實(shí)現(xiàn)實(shí)體模型的自動(dòng)創(chuàng)建了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.Net中關(guān)于stirng轉(zhuǎn)System.Type的一種實(shí)現(xiàn)思路詳解
這篇文章主要給大家介紹了.Net中關(guān)于stirng轉(zhuǎn)System.Type的一種實(shí)現(xiàn)思路的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
Winform OpenFileDialog打開(kāi)文件對(duì)話(huà)框
這篇文章主要為大家詳細(xì)介紹了Winform OpenFileDialog打開(kāi)文件對(duì)話(huà)框 的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Asp.Mvc?2.0實(shí)現(xiàn)用戶(hù)注冊(cè)實(shí)例講解(1)
這篇文章主要介紹了Asp.Mvc?2.0如何實(shí)現(xiàn)用戶(hù)注冊(cè),實(shí)例講解很細(xì)致,注冊(cè)功能是每個(gè)網(wǎng)站必不可少的組成部分,感興趣的的朋友可以參考下2015-08-08
分享Visual Studio原生開(kāi)發(fā)的10個(gè)調(diào)試技巧(2)
這篇文章又為大家分享了Visual Studio原生開(kāi)發(fā)的10個(gè)調(diào)試技巧,感興趣的朋友可以參考一下2015-11-11
Asp.Net其他頁(yè)面如何調(diào)用Web用戶(hù)控件寫(xiě)的分頁(yè)
這篇文章主要介紹了Asp.Net其他頁(yè)面如何調(diào)用Web用戶(hù)控件寫(xiě)的分頁(yè),需要的朋友可以參考下2014-05-05
.Net?Core?NPOI?導(dǎo)出多級(jí)表頭的實(shí)現(xiàn)代碼
這篇文章介紹了如何使用.NetCore和NPOI庫(kù)導(dǎo)出多級(jí)表頭的表格數(shù)據(jù),并附上了源碼,感興趣的朋友一起看看吧2024-11-11

