gpt4 book ai didi

asp.net-mvc - 在 Entity Framework MVC 中更新子实体

转载 作者:行者123 更新时间:2023-12-04 23:50:00 26 4
gpt4 key购买 nike

我在我的 View 中显示父实体及其子实体,并使用户能够编辑父实体和子实体。

当用户点击保存时。父实体只会被修改,而子实体会被忽略。我的工作是这样的。

var addressRepo=_dataRepositoryFactory.GetDataRepository<IPatientAddressRepository>();
foreach (var address in entity.Addresses)
{
addressRepo.Update(address);
}

_dataRepositoryFactory.GetDataRepository<IPatientContactRepository>().Update(entity.Contact);


var guardianRepo = _dataRepositoryFactory.GetDataRepository<IPatientGuardianRepository>();
foreach (var guardian in entity.Guardians)
{
guardianRepo.Update(guardian);
}

_dataRepositoryFactory.GetDataRepository<IPatientDemographicRepository>().Update(entity.Demographic);

return _patientRepository.Update(entity);

有没有更好的方法来更新所有子实体?

最佳答案

对断开连接的实体应用更新时的标准模式如下:

  • 将根实体附加到上下文以启用跨图形的更改跟踪
  • 这将整个对象图标记为 EntityState.Unchanged ,因此您需要走图并相应地设置状态
  • 将父实体标记为 EntityState.Modified以便其更改被持久化
  • 对于每个子实体,确定更改的性质(插入、删除或更新)并相应地标记它们的状态
  • 保存上下文后,图形中的更改将被持久化。

  • 采用这种方法意味着您可以将依赖项需求减少到根实体的单个存储库。

    例如,假设您只处理更新:
    using (var context = new MyContext())
    {
    context.attach(parentEntity);
    context.Entry(parentEntity).State = EntityState.Modified;

    context.Entity(parentEntity.ChildEntity1).State = EntityState.Modified;
    context.Entity(parentEntity.ChildEntity2).State = EntityState.Modidied;

    context.SaveChanges();
    }

    这通常封装在存储库上的 AttachAsModified 方法中,该方法知道如何根据图的根实体“绘制对象图的状态”。

    例如。
    public class MyRepository<TEntity>
    {
    public void AttachAsModified(TEntity entity)
    {
    _context.attach(entity);
    _context.Entry(entity).State = EntityState.Modifed;
    _context.Entity(entity.ChildEntity1).State = EntityState.Modified;
    // etc
    _context.SaveChanges();
    }
    }

    如果您需要考虑插入或删除子实体,则存在额外的复杂性。这些归结为加载根实体及其子实体的当前状态,然后将子集合与更新的根实体上的集合进行比较。然后将状态设置为 EntityState.DeletedEntityState.Added取决于集合的重叠。

    NB 代码直接输入浏览器,因此可能/将会有一些拼写错误。

    关于asp.net-mvc - 在 Entity Framework MVC 中更新子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24789903/

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