2016-11-06 15 views
2

私はCompanyモデルを持っています。Companyレコードを更新して、一度に電話番号のリストを保存したいと思います。 1 - *の関係があります。1対多の関係を持つオブジェクトを保存する

私のViewModelには次のようになります。私が呼び出した場合、私のSave(Company company)方法で

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; } 
} 

_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つのことを行う必要があります。

、このインターフェイスからすべてのあなたのentitesを継承すべてのエンティティが

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

から継承する基本インタフェースを、作成します。これにより

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; 
     } 
    } 
} 
関連する問題