.net ef core 領域設計代碼轉換(上篇)
阿新 • • 發佈:2017-11-10
解決 con mage keys $1 服務 結構 刪除 sql
一、前言
.net core 2.0正式版已經發布幾個月了,經過研究,決定把項目轉移過來,新手的話可以先看一些官方介紹
傳送門:https://docs.microsoft.com/zh-cn/dotnet/core/
由於在領域設計模型上遇到了一些坑,故給大家分享出來自己的一些解決方案。
ok,直接上幹貨,大概結構如下:
比較教科書式的架構。
二、領域層
領域實體
值對象
規約接口
工作單元接口
倉儲接口
聚合跟劃分,我們先建立一個簡單的用戶實體
三、倉儲層
引用Microsoft.EntityFrameworkCore.Sqlite
工作單元ISql接口
工作單元IQueryableUnitOfWork接口
接下來是重點了,構造函數的改變:
OnModelCreating變化:
以前的設置
現在ef core裏面沒有提供這麽方便的封裝,需要自己去實現
數據庫表名更改:
public static void SetSimpleUnderscoreTableNameConvention(this ModelBuilder modelBuilder) { foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes()) { Regex underscoreRegex= new Regex(@"((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)"); entity.Relational().TableName = underscoreRegex.Replace(entity.DisplayName(), @"$1$2").ToLower(); } }
關掉所有主外鍵關系的級聯刪除
public static void SetOneToManyCascadeDeleteConvention(this ModelBuilder modelBuilder) { foreach(var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) { relationship.DeleteBehavior = DeleteBehavior.Restrict; } }
Fluent Api 配置
public abstract class EntityTypeConfiguration<TEntity> where TEntity : class { public abstract void Map(EntityTypeBuilder<TEntity> builder); }
public static void AddConfiguration<TEntity>(this ModelBuilder modelBuilder, EntityTypeConfiguration<TEntity> configuration) where TEntity : class { configuration.Map(modelBuilder.Entity<TEntity>()); }
public class UserEntityTypeConfiguration : EntityTypeConfiguration<User> { public override void Map(EntityTypeBuilder<User> builder) { builder.HasKey(u => u.Id); } }
使用的時候就這樣添加,毫無違和感。
Sql查詢的方式改變了一下
User表倉儲實現的時候註意一下構造函數的類型,.net core依賴註入的時候會涉及到這裏
四、應用層
應用層沒什麽變化,直接貼代碼
五、分布式服務層
.net core自帶了一個簡單的Ioc,所以以前我們用的類似於Unity等框架就可以去掉了
Configuration這個是怎麽來的呢?
.net core現在建議采用Json等配置文件,用起來非常爽非常強大
然後我們需要確保存數據庫不存在的時候正確創建
UserController代碼:
六:展示層
WPF界面簡單弄一下
後臺代碼:
.net ef core 領域設計代碼轉換(上篇)