文章以efcore 2.0.0-preview2.測(cè)試驗(yàn)證通過(guò)。其他版本不保證使用,但是思路不會(huì)差太遠(yuǎn)。源代碼,報(bào)道越短,事情越嚴(yán)重!文章越短,內(nèi)容越精悍!
目標(biāo):
1.實(shí)現(xiàn)entity的自動(dòng)發(fā)現(xiàn)和mapper設(shè)置.
2.默認(rèn)字符串長(zhǎng)度,而不是nvarchar(max).
3.decimal設(shè)置精度
實(shí)現(xiàn)目標(biāo)1:繼承RelationalModelCustomizer,重寫(xiě)Customize方法。
當(dāng)然,我們也可以重寫(xiě)dbcontext的OnModelCreating方法,but,我們?cè)趺茨苓@么low呢。必須要用點(diǎn)高級(jí)玩意是吧,當(dāng)然這也是更底層的擴(kuò)展方式。項(xiàng)目里面有多個(gè)dbcontext的話,在這里集中擴(kuò)展管理比較方便。
在然后,這個(gè)RelationalModelCustomizer繼承自ModelCustomizer。在聯(lián)想到efcore未來(lái)的版本會(huì)支持redis,nosql什么的。到時(shí)候估計(jì)還回有一個(gè)osqlModelCustomizer之類(lèi)的吧,期待中......
實(shí)現(xiàn)目標(biāo)2、3:繼承自CoreConventionSetBuilder類(lèi),重寫(xiě)CreateConventionSet方法。
重寫(xiě)CreateConventionSet方法,能拿到關(guān)鍵的ConventionSet對(duì)象。這個(gè)對(duì)象囊括了諸多的約定配置等等。比如maxlengthattribute屬性標(biāo)記,stringlength屬性標(biāo)記,timestamp屬性標(biāo)記,表id的自動(dòng)發(fā)現(xiàn)規(guī)則等等等。。。
那,我們?cè)黾?個(gè)小小的約定:字符串默認(rèn)長(zhǎng)度(StringDefaultLengthConvention),和decimal精度設(shè)置attribute(DecimalPrecisionAttributeConvention)及fluntapi方式.
文章的最后附efcore 所有的可替換擴(kuò)展service。
//servie,DI注入替換.services.AddSingleton<IModelCustomizer, MyRelationalModelCustomizer>(); services.AddSingleton<ICoreConventionSetBuilder, MyCoreConventionSetBuilder>();//實(shí)現(xiàn)entity的自動(dòng)發(fā)現(xiàn)和mapper設(shè)置public class MyRelationalModelCustomizer : RelationalModelCustomizer{ public MyRelationalModelCustomizer(ModelCustomizerDependencies dependencies) : base(dependencies){} public override void Customize(ModelBuilder modelBuilder, DbContext dbContext) { base.Customize(modelBuilder, dbContext);&nb