我正在撰寫一個庫,它將圍繞DbContextEntity Framework Core 5 中的類提供新的 API 。我已經有了這些新 API 的一個版本,但它需要在最終DbContext實作中手動干預,例如:
// Code in the library.
public static class AwesomeExtensions
{
public static ModelBuilder AddAwesomeExtensionsSupportingEntities(this ModelBuilder modelBuilder)
{
// Set up custom entities I need to make this work.
return modelBuilder;
}
}
// Code somewhere else.
public class MyBusinessDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// I would like to avoid doing this here.
modelBuilder.AddAwesomeExtensionsSupportingEntities();
// Business as usual (database entities).
}
}
經過擴展搜索后,我沒有在 EF Core API 中找到允許我以非侵入性方式執行此操作的擴展點。
這是我迄今為止發現的:
- CustomDbContext 類:我可以繼承
DbContext和覆寫該OnModelCreating方法,但這并不比我現在正在做的更好。 DbContextOptionsBuilder.UseModel: 我認為這可能是我可以使用的東西,但增加了太多的復雜性。通過使用此 APIOnModelCreating,框架不會呼叫該方法。IEntityTypeConfiguration<TEntity>:我支持這個,但它也要求您有權訪問該ModelBuilder實體,然后您才能使用該ModelBuilder.ApplyConfigurationsFromAssembly方法。
理想情況下,我想通過DbContextOptionsBuilder注冊DbContext依賴項時提供的物件來執行此操作,例如:
// Code in some application.
public void AddServices(IServiceCollection services)
{
services.AddDbContext<MyBusinessDbContext>(options =>
{
// The ideal solution.
options.UseAwesomeExtensions();
});
}
如果我只能ModelBuilder在提供給OnModelCreating方法之前攔截 的實體,以不需要修改DbContext實作的方式,那將對我有所幫助。
歡迎任何想法。
謝謝你。
uj5u.com熱心網友回復:
負責呼叫EF核心服務OnModelCreating被稱為IModelCustomizer單方法
public void Customize(ModelBuilder modelBuilder, DbContext context);
攔截該方法可以讓您做您需要的事情。唯一的問題是 EF Core 沒有提供一種簡單的方法來覆寫現有的實作。唯一可用的方法是ReplaceService要么全有要么全無,但明顯的缺點是,如果您只想執行基本實作的前/后處理,您需要知道要替換的類是哪個。當然,其他一些擴展也可以替換您的實作(最后獲勝)。
正確實作它需要一堆樣板來注冊自定義IDbContextOptionsExtension,以便能夠直接操作ApplyServices方法內部的服務集合。如果您有興趣,可以在其他 EF Core 擴展庫(例如 LinqKit)中找到示例。
假設沒有其他擴展覆寫有問題的服務,并且知道默認的 EF Core 實作當前由ModelCustomizer一般RelationalModelCustomizer類或關系資料庫類提供(但目前沒有向簡單呼叫的基本實作添加任何內容OnModelCreating),簡化的實作是繼承其中一個并用您的實作替換服務的問題。例如像
namespace Microsoft.EntityFrameworkCore
{
using Infrastructure;
public static class AwesomeDbContextOptionsExtensions
{
public static DbContextOptionsBuilder UseAwesomeExtensions(
this DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.ReplaceService<IModelCustomizer, AwesomeModelCustomizer>();
}
}
namespace Microsoft.EntityFrameworkCore.Infrastructure
{
public class AwesomeModelCustomizer : RelationalModelCustomizer
{
public AwesomeModelCustomizer(ModelCustomizerDependencies dependencies)
: base(dependencies) { }
public override void Customize(ModelBuilder modelBuilder, DbContext context)
{
// Do something before context.OnModelCreating(modelBuilder)...
base.Customize(modelBuilder, context);
// Do something after context.OnModelCreating(modelBuilder)...
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321746.html
上一篇:記錄C語言學習歷程1
