2016-11-06 146 views
2

我有一個Company模型,我想更新Company記錄並一次保存一個電話號碼列表。有1 *關係。保存一對多關係的對象

我的視圖模型看起來像:

public class CompanyRegisterViewModel 
{ 
    public int CompanyId { get; set; } 

    public int CompanyTypeId { get; set; } 

    public IEnumerable<SelectListItem> CompanyTypes { get; set; } 

    [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ValidationStringResource))] 
    [MaxLength(250, ErrorMessageResourceName = "MaximumLength", ErrorMessageResourceType = typeof(ValidationStringResource))] 
    public string LicensedCompanyName { get; set; } 

    public List<Phone> Phones { get; set; } 
} 

在我Save(Company company)方法,如果我叫:

_context.Companies.Add(company); 
_context.SaveChanges(); 

能夠節省一個新的公司記錄並保存List<Phone> Phones或者我需要一個事務,再次撥打SaveChanges()以保存Phones。我還需要爲每個Phone記錄設置CreatedByDateCreated。在保存並更新foreach循環中的每條記錄之前,是否應該循環訪問Phone記錄?我想在後臺自動設置這個設置,而不是在UI中。

+0

你在OnModelCreating方法中設置/配置了關係嗎? – Marco

+0

是的。我認爲它應該更新,當我調用'SaveChanges',但我怎麼能設置'CreatedBy'和'DateCreated'沒有循環通過每個電話記錄? – Andrew

+0

我正在寫答案。給我幾分鐘 – Marco

回答

2

如果您想在每次調用SaveChanges或SaveChangesAsync時自動設置屬性,如ModifiedModifiedBy,則必須執行2項操作。

創建一個基本接口,使所有的實體從

public interface IEntityRoot 
{ 
    public DateTime Created { get; set; } 
    public string CreatedBy { get; set; } 
    public DateTime Modified { get; set; } 
    public string ModifiedBy { get; set; } 
} 

繼承繼承這個接口所有的entites:

public class Company : IEntityRoot { ... } 

有了這個,從這個接口繼承的所有實體將有屬性Created & CreatedBy。最後一步是創建一個小方法,每次保存更改時都會調用該方法,並自動設置當前日期和用戶。

public class ApplicationContext : DbContext 
{ 
    /* ... */ 
    public override int SaveChanges() 
    { 
     TrackModifiedDates(); 
     return base.SaveChanges(); 
    } 

    public override async Task<int> SaveChangesAsync() 
    { 
     TrackModifiedDates(); 
     return await base.SaveChangesAsync(); 
    } 

    private void TrackModifiedDates() 
    { 
     var entities = ChangeTracker.Entries() 
            .Where(x => x.Entity is IEntityRoot && (x.State == EntityState.Added) || (x.State == EntityState.Modified)); 
     //if anonymous access is possible, do a null check here. 
     var userName = HttpContext.Current.User.Identity.Name 

     foreach (var entity in entities) 
     { 
      if(entity.State == EntityState.Added) 
      { 
       ((IEntityRoot)entity.Entity).Created = DateTime.UtcNow; 
       ((IEntityRoot)entity.Entity).CreatedBy = userName; 
      } 

      ((IEntityRoot)entity.Entity).Modified = DateTime.UtcNow; 
      ((IEntityRoot)entity.Entity).ModifiedBy = userName; 
     } 
    } 
}