在实体框架7(SQL Server)中将UpdatedBy列设置为SUSER_SNAME()

时间:2015-12-20 12:01:45

标签: entity-framework entity-framework-core

我需要将每个修改后的实体中的UpdatedBy列设置为SUSER_SNAME()。我试图通过覆盖SaveChanges方法来实现,如下所示。

编辑:对HasComputedColumnSql()使用计算列(UpdatedBy}是一个选项。但是,这对我来说不起作用,因为我有时需要将UpdatedBy设置为一个值。我需要SUSER_SNAME()作为后备值。更新了代码以说明这一点。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>().Property(e => e.CreatedBy).HasDefaultValueSql("SUSER_SNAME()");
    modelBuilder.Entity<Customer>().Property(e => e.UpdatedBy).HasDefaultValueSql("SUSER_SNAME()");
}

public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
    foreach (var entity in ChangeTracker.Entries())
    {
        if (entity.State == EntityState.Modified)
        {
            entity.Property("CreatedBy").IsModified = false;

            var currUser = GetCurrentUser();

            if (currUser != null)
            {
                entity.Property("UpdatedBy").CurrentValue = currUser;
            }
            else
            {
                // Is there a way to set CurrentValue as SUSER_SNAME()?
                entity.Property("UpdatedBy").CurrentValue = "???";
            }
        }
    }

    return base.SaveChanges(acceptAllChangesOnSuccess);
}

我找不到将CurrentValue设置为SUSER_SNAME()的方法,类似于使用HasDefaultValueSql()设置默认值的方式。
有人可以建议一种方法来实现这个目标吗? 感谢

1 个答案:

答案 0 :(得分:0)

不是直截了当的 您可以使用sql server触发器,也可以编写一个函数来检索SUSER_SNAME 您可以在SaveChanges覆盖

下方的上下文中插入以下函数
private string GetDbUser()
{
    DbConnection connection = Database.GetDbConnection();
    DbCommand command = connection.CreateCommand();
    command.CommandText = "SELECT SUSER_SNAME()";
    var connectionState = connection.State;
    if (connectionState != ConnectionState.Open)
        connection.Open();
    string user = (string)command.ExecuteScalar();
    if (connectionState != ConnectionState.Open)
        connection.Close();
    return user;
}

然后您可以使用entity.Property("UpdatedBy").CurrentValue = GetDbUser();