我需要将每个修改后的实体中的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()
设置默认值的方式。
有人可以建议一种方法来实现这个目标吗?
感谢
答案 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();