保存前设定值 [英] Set Value before save

查看:106
本文介绍了保存前设定值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道是否有任何方法可以为实体保存设置值?


因为我正在处理多租户Web应用程序,所以我想设置当前的租户ID(通过简单的DI服务)。



我尝试在Fluent API中使用 HasDefaultValue(),但是这将尝试转换为SQL函数。因此,这对我不起作用。

  builder.Entity< Order>()
.HasQueryFilter(p = > p.TenantId == _tenantProvider.GetTenantId())
.Property(p => p.TenantId)
.HasDefaultValue(_tenantProvider.GetTenantId());

任何建议都将不胜感激。

解决方案

您可以覆盖 DbContext.SaveChanges()方法并迭代ChangeTracker条目:

 公共替代int SaveChanges()
{
foreach(ChangeTracker.Entries()中的varentityEntry)//迭代所有已进行的更改
{
if(entityEntry.Entity是Order order)
{
if(entityEntry.State == EntityState.Added)//如果要在添加订单时更新TenantId
{
order.TenantId = _tenantProvider.GetTenantId();
}
else if(entityEntry.State == EntityState.Modified)//如果要在修改Order后更新TenantId,则
{
order.TenantId = _tenantProvider.GetTenantId( );
}
}
}
返回base.SaveChanges();
}

当然,这需要将租户提供者注入您的上下文中。 / p>

I was wondering if there is any way to set a value to an entity onsave?
Because I'm working on a multi tenant web application and I would like to set the the current tenant ID (through simple DI service).

I tried using HasDefaultValue() in Fluent API, however this will try to convert to a SQL function. So this doesn't work for me.

builder.Entity<Order>( )
    .HasQueryFilter(p => p.TenantId == _tenantProvider.GetTenantId())
    .Property(p => p.TenantId)
    .HasDefaultValue(_tenantProvider.GetTenantId());

Any suggestions are greatly appreciated.

解决方案

You could override the DbContext.SaveChanges() method and iterate the ChangeTracker entries:

public override int SaveChanges()
{
    foreach (var entityEntry in ChangeTracker.Entries()) // Iterate all made changes
    {
        if (entityEntry.Entity is Order order)
        {
            if (entityEntry.State == EntityState.Added) // If you want to update TenantId when Order is added
            {
                order.TenantId = _tenantProvider.GetTenantId();
            }
            else if (entityEntry.State == EntityState.Modified) // If you want to update TenantId when Order is modified
            {
                order.TenantId = _tenantProvider.GetTenantId();
            }
        }
    }
    return base.SaveChanges();
}

Of course, this needs the tenant provider to be injected into your context.

这篇关于保存前设定值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆