我可以拦截 ef core 中的架构创建吗?

问题描述 投票:0回答:1

有什么方法可以拦截模式创建。我的意思是这样的。 我有这样的数据库上下文注册:

Services.AddDbContext<MyContext>(options => options
     .UseSqlServer()
     .MyExtensionMethod())

我的扩展方法扩展了

DbContextOptionsBuilder
,我需要从此方法中拦截
OnModelCreating
方法。 我的目标是当用户调用此扩展方法时,我将通过
ModelBuilder.Entity<>
配置将另一个实体添加到此数据库上下文中。

这个新实体实际上是我的库中的类(这个扩展方法也是这个库的一部分)。所以我想从

MyExtensionMethod
拦截用户模式创建并向其中添加新表。我该怎么做?

我尝试过使用

IModelCustomizer
,但问题是它需要替换当前的实现,我害怕使用它,因为也许用户正在使用一些自定义定制器,并且使用我的扩展方法我将替换它。它将破坏用户的功能。 如果我以某种方式装饰当前的
IModelCustomizer
,也许会非常有帮助,但是当我尝试时,我找不到任何方法来做到这一点

.net-core entity-framework-core ef-code-first entity-framework-migrations
1个回答
1
投票

是的,您可以通过替换选项中的

IModelCustomizer
来实现此目的。

这是此类扩展方法的示例实现:

public static class MyLibraryOptionsExtensions
{
    public static DbContextOptionsBuilder MyExtensionMethod(this DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.ReplaceService<IModelCustomizer, MyLibraryCustomModelCustomizer>();
        return optionsBuilder;
    }
}
public class MyLibraryCustomModelCustomizer : RelationalModelCustomizer
{
    public MyLibraryCustomModelCustomizer(ModelCustomizerDependencies dependencies) : base(dependencies)
    {
    }

    public override void Customize(ModelBuilder modelBuilder, DbContext context)
    {
        // Add your custom configurations here
        ApplyCustomConventions(modelBuilder);
    }

    private void ApplyCustomConventions(ModelBuilder modelBuilder)
    {
        // register any entities, which you want
        modelBuilder.Entity<MyEntity>();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.