EF Core генерация значения при добавлении с пользовательским ValueGenerator
Создает значения для свойств при добавлении объекта в контекст.
может использоваться для присвоения TenantId
новым объектам.Внутри метода Next
вы можете получить TenantId
из контекста (или некоторого сервиса).
Взяв ваш пример, генератор значений может быть вложенным классом внутри вашего DbContext
, например так:
class TenantIdValueGenerator : ValueGenerator<int>
{
public override bool GeneratesTemporaryValues => false;
public override int Next(EntityEntry entry) => GetTenantId(entry.Context);
int GetTenantId(DbContext context) => ((YourDbContext)context)._tenantProvider.GetTenantId();
}
Все, что вам нужно, - это назначить генератор для свойства TenantId
, используя некоторые из HasValueGenerator свободный API.
Единственная проблема заключается в том, что при проектировании значениягенераторы вызываются, только если свойство не имеет явно установленного значения (для свойства int
- если значение равно 0
).
Так что лучше подходить к абстрагированию (и полному контролю) TenantId
свойство, удалив его из моделей сущностей и заменив его теневым свойством .
Следовательно, я предлагаю удалить TenantId
из классов сущностей и вызвать следующий метод внутри вашего OnModelCreating
для каждой сущности, которой требуется столбец TenantId
:
void ConfigureTenant<TEntity>(ModelBuilder modelBuilder) where TEntity : class
{
modelBuilder.Entity<TEntity>(builder =>
{
builder.Property<int>("TenantId")
.HasValueGenerator<TenantIdValueGenerator>();
builder.HasQueryFilter(e => EF.Property<int>(e, "TenantId") == _tenantProvider.GetTenantId());
});
}