gpt4 book ai didi

c# - 保存具有一对多关系的对象

转载 作者:行者123 更新时间:2023-11-30 23:19:06 26 4
gpt4 key购买 nike

我有一个 Company模型,我想更新 Company一次记录并保存电话号码列表。存在1-*关系。

我的 ViewModel 看起来像:

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 .我还需要设置 CreatedByDateCreated对于每个 Phone记录。我应该遍历 Phone 吗?保存和更新 foreach 中的每条记录之前的记录环形?我希望在后端而不是在 UI 中自动设置此设置。

最佳答案

如果您想在每次调用 SaveChanges 或 SaveChangesAsync 时自动设置 ModifiedModifiedBy 等属性,您必须做两件事。

创建一个基础接口(interface),您的所有实体都从该基础接口(interface)继承

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

从此接口(interface)继承所有实体:

  public class Company : IEntityRoot { ... }

有了这个,从这个接口(interface)继承的所有实体都将具有属性 CreatedCreatedBy。最后一步是创建一个小方法,每次保存更改时都会调用该方法并自动设置当前日期和用户。

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

关于c# - 保存具有一对多关系的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com