文章以efcore 2.0.0-preview2.測試驗證通過。其他版本不保證使用,但是思路不會差太遠。源代碼,報道越短,事情越嚴重!文章越短,內(nèi)容越精悍!

目標:
1.實現(xiàn)entity的自動發(fā)現(xiàn)和mapper設(shè)置.
2.默認字符串長度,而不是nvarchar(max).
3.decimal設(shè)置精度

實現(xiàn)目標1:繼承RelationalModelCustomizer,重寫Customize方法。

當然,我們也可以重寫dbcontext的OnModelCreating方法,but,我們怎么能這么low呢。必須要用點高級玩意是吧,當然這也是更底層的擴展方式。項目里面有多個dbcontext的話,在這里集中擴展管理比較方便。
在然后,這個RelationalModelCustomizer繼承自ModelCustomizer。在聯(lián)想到efcore未來的版本會支持redis,nosql什么的。到時候估計還回有一個osqlModelCustomizer之類的吧,期待中......
Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

實現(xiàn)目標2、3:繼承自CoreConventionSetBuilder類,重寫CreateConventionSet方法。

重寫CreateConventionSet方法,能拿到關(guān)鍵的ConventionSet對象。這個對象囊括了諸多的約定配置等等。比如maxlengthattribute屬性標記,stringlength屬性標記,timestamp屬性標記,表id的自動發(fā)現(xiàn)規(guī)則等等等。。。
那,我們增加2個小小的約定:字符串默認長度(StringDefaultLengthConvention),和decimal精度設(shè)置attribute(DecimalPrecisionAttributeConvention)及fluntapi方式.

文章的最后附efcore 所有的可替換擴展service。

//servie,DI注入替換.services.AddSingleton<IModelCustomizer, MyRelationalModelCustomizer>();
services.AddSingleton<ICoreConventionSetBuilder, MyCoreConventionSetBuilder>();//實現(xiàn)entity的自動發(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