gpt4 book ai didi

c# - 我可以指示 EF DbContext 使用 "real"参数名称吗?

转载 作者:行者123 更新时间:2023-11-30 16:57:13 25 4
gpt4 key购买 nike

我正在使用 EF(6,如果重要的话)DbContext 子类,并尝试实现一个拦截器以在将实体写入数据库时​​设置或更新审计数据。

我的拦截器类:

public class EntitySaveInterceptor : BaseDbCommandInterceptor
{
private const string CreatedAt = "@CreatedAt";
private const string ModifiedAt = "@ModifiedAt";

//called for update, but not insert
public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
var parameters = command.Parameters
.OfType<DbParameter>()
.ToDictionary(p => p.ParameterName, p => p);
if (parameters.ContainsKey(ModifiedAt))
{
parameters[ModifiedAt].Value = SystemTime.UtcNow();
}
}

//called for insert
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
var parameters = command.Parameters
.OfType<DbParameter>()
.ToDictionary(p => p.ParameterName, p => p);
if (parameters.ContainsKey(CreatedAt))
{
parameters[CreatedAt].Value = SystemTime.UtcNow();
}
if (parameters.ContainsKey(ModifiedAt))
{
parameters[ModifiedAt].Value = SystemTime.UtcNow();
}
}
}

我遇到的问题是这些命令不包含"@CreatedAt""@ModifiedAt" 参数。相反,CreatedAt 列的值在名为 @3 的参数中传递(指示值列表中的零索引位置),ModifiedAt 列(DateTime? 值)在其值为 null 时在生成的 SQL 中被硬编码为 NULL

我找到了 this answer , 但粗略检查 the SqlCommand properties表明 BindByName 是 ODP.Net 特定的概念。

很明显,此时我可以检查命令文本,将 INSERT 语句中的列名称与 中的参数名称和 NULL 匹配VALUES 子句,并更新 command.Parameters 集合以匹配新的 SQL。但是,如果可能的话,我更愿意让我的 DbContext 使用与列名称匹配的参数名称。

那么 - 在创建 DbCommand 对象时,我能否指示我的 DbContext 或它所依赖的东西使用基于属性或列名称的参数名称?

最佳答案

另一种方法是覆盖 DbContext.SaveChanges 并在那里设置属性值。以下是将当前日期/时间应用到任何具有 CreatedAt 属性的添加实体的类型不可知(尽管不一定是最有效的)示例:

    public override int SaveChanges()
{
foreach( var entry in this.ChangeTracker.Entries() )
{
if( entry.State == EntityState.Added &&
entry.CurrentValues.PropertyNames.Contains( "CreatedAt" ) )
{
entry.CurrentValues[ "CreatedAt" ] = DateTime.Now;
}
}

return base.SaveChanges();
}

关于c# - 我可以指示 EF DbContext 使用 "real"参数名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26854657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com