由於邏輯需要,我希望能在EF Core實例化實體時,拿到實體並執行相關代碼,所以我就研究了一番EF Core,得到以下方法。 1.創建實體初始化類,繼承EntityMaterializerSource 這個類是,我們需要註入到EF Core當中去的。 2.創建EF Core擴展 創建擴展後,在App ...
由於邏輯需要,我希望能在EF Core實例化實體時,拿到實體並執行相關代碼,所以我就研究了一番EF Core,得到以下方法。
1.創建實體初始化類,繼承EntityMaterializerSource
public class ComBoostEntityMaterializerSource : EntityMaterializerSource { public ComBoostEntityMaterializerSource(IMemberMapper memberMapper) : base(memberMapper) {} }
這個類是,我們需要註入到EF Core當中去的。
2.創建EF Core擴展
public class ComBoostOptionExtension : IDbContextOptionsExtension { public void ApplyServices(IServiceCollection services) { services.AddScoped<IEntityMaterializerSource, ComBoostEntityMaterializerSource>(); } }
創建擴展後,在ApplyServices里註入我們創建的初始化類。
3.用於實例化DbContext時的DbContextOptions參數,需要添加我們創建的擴展
new DbContextOptionsBuilder<DataContext>().UseSqlServer(Configuration.GetConnectionString("DataContext")).Options.WithExtension(new ComBoostOptionExtension()))
4.重寫我們的實體初始化類
public class ComBoostEntityMaterializerSource : EntityMaterializerSource { public ComBoostEntityMaterializerSource(IMemberMapper memberMapper, CurrentDatabaseContext current) : base(memberMapper) {
//已註入的,用於業務的獲取當前資料庫上下文的類 _database = current.Context; } private IDatabaseContext _database;
//創建實例化實體的表達式 public override Expression CreateMaterializeExpression(IEntityType entityType, Expression valueBufferExpression, int[] indexMap = null) {
//獲取基類實例化表達式 BlockExpression expression = (BlockExpression)base.CreateMaterializeExpression(entityType, valueBufferExpression, indexMap);
//業務邏輯判斷是否是我需要更改的實體 if (typeof(IEntity).IsAssignableFrom(entityType.ClrType)) { var entityContext = _database.GetDynamicContext(entityType.ClrType);
//屬性表達式 var property = Expression.Property(expression.Variables[0], typeof(IEntity).GetProperty("EntityContext"));
//賦值表達式 var assign = Expression.Assign(property, Expression.Constant(entityContext));
//把幾類的實例化表達式變成列表方便插入 var list = expression.Expressions.ToList();
//因為最後一個表達式是返回實體實例
//所以我們的邏輯代碼要放在最後一條語句之前 list.Insert(list.Count - 1, assign);
//重新生成表達式 expression = Expression.Block(expression.Variables, list); } return expression; } }
下麵是效果展示
1.User類有一個顯式實現的屬性
2.正常賦值
3.註入後
4.效果