2015-10-06 90 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(); 
}