【问题标题】:Alter SaveChanges when Seeding database播种数据库时更改 SaveChanges
【发布时间】:2015-10-06 08:50:58
【问题描述】:

我有一个设置,我使用服务登录用户并为我的实体自动填充 CreatedBy、UpdatedBy、... 字段。因此,我的 SaveChanges 方法如下所示:

public override int SaveChanges()
{
    var modifiedEntries = ChangeTracker.Entries()
        .Where(x => x.Entity is IAuditableEntity
                        && (x.State == EntityState.Added || x.State == EntityState.Modified));

    var activeUserId = ActiveUserService.UserId;
    var username = Users.First(x => x.Id == activeUserId).UserName;

    foreach (var entry in modifiedEntries)
    {
        IAuditableEntity entity = entry.Entity as IAuditableEntity;

        if (String.IsNullOrEmpty(username))
        {
            throw new AuthenticationException(
                "Trying to save entities of type IAuditable while not logged in. Use the IActiveUserService to set a logged in user");
        }

        if (entity != null)
        {
            DateTime now = DateTime.Now;

            if (entry.State == EntityState.Added)
            {
                entity.CreatedBy = username;
                entity.CreatedAt = now;
            }
            else
            {
                base.Entry(entity).Property(x => x.CreatedBy).IsModified = false;
                base.Entry(entity).Property(x => x.CreatedAt).IsModified = false;
            }

            entity.UpdatedBy = username;
            entity.UpdatedAt = now;
        }
    }

    return base.SaveChanges();
}

问题是当我为我的数据库播种时,Autofac 没有运行,也没有注入我的服务。是否有可能在某处设置某种标志,当我为数据库播种时,我使用默认用户名或其他东西?

【问题讨论】:

    标签: c# asp.net entity-framework autofac


    【解决方案1】:

    在您的代码中,如果没有用户登录(因此没有activeUserId),它将在First() 上出现异常:

    var username = Users.First(x => x.Id == activeUserId).UserName;
    

    所以一行:

    if (String.IsNullOrEmpty(username))
    

    永远不会是真的。

    我会在方法中加入一个可为空的变量:SaveChanges(int? activeUserId = null),当你的 Seed 方法调用它时,它将为空,你可以处理它来将用户名设置为 SYSTEM。但是对于所有其他代码,您可以提供用户的 id 并进行处理。

    编辑:总结:方法本身不应该检查用户是否登录,在其他地方做。

    【讨论】:

    • 向 savechanges 添加参数是个好主意!我想我会使用它。
    【解决方案2】:

    我目前的解决方法是在为设置默认用户的数据库播种时创建另一个 SaveChanges 方法。

    internal int SaveChangesWithDefaultUser()
    {
        var modifiedEntries = ChangeTracker.Entries()
            .Where(x => x.Entity is IAuditableEntity
                        && (x.State == EntityState.Added || x.State == EntityState.Modified));
    
        var username = "SYSTEM";
    
        foreach (var entry in modifiedEntries)
        {
            IAuditableEntity entity = entry.Entity as IAuditableEntity;
    
            if (entity != null)
            {
                DateTime now = DateTime.Now;
    
                if (entry.State == EntityState.Added)
                {
                    entity.CreatedBy = username;
                    entity.CreatedAt = now;
                }
                else
                {
                    base.Entry(entity).Property(x => x.CreatedBy).IsModified = false;
                    base.Entry(entity).Property(x => x.CreatedAt).IsModified = false;
                }
    
                entity.UpdatedBy = username;
                entity.UpdatedAt = now;
            }
        }
    
        return base.SaveChanges();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-29
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2015-09-25
      • 1970-01-01
      • 2014-03-01
      相关资源
      最近更新 更多