2015-10-06 87 views
0

我有一个设置,我使用服务登录用户并为我的实体自动填充CreatedBy,UpdatedBy,...字段。正因为如此我SaveChanges方法是这样的:在播种时更改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不运行,不注入我的服务。是否有可能在某处设置了某种标志,当我播种我的数据库时,我使用默认的用户名或其他?

回答

1

在你的代码,如果没有用户登录(所以没有activeUserId),它会用一个异常打破First()

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

因此该行:

if (String.IsNullOrEmpty(username)) 

永远不会是真的。

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

编辑:总结:方法本身不应该检查用户是否已登录,请在其他位置执行此操作。

+0

将参数添加到savechanges是一个好主意!我想我会用这个。 – Thijs

0

当接种设置默认用户的数据库时,我目前的解决方法是创建另一个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(); 
}