2016-11-06 117 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; 
     } 
    } 
}