Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在实体框架MVC中更新子实体_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 在实体框架MVC中更新子实体

Asp.net mvc 在实体框架MVC中更新子实体,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我在视图中显示父实体及其子实体,并允许用户编辑父实体和子实体 当用户单击save时。仅修改父实体,而忽略子实体。我的工作就是这样 var addressRepo=_dataRepositoryFactory.GetDataRepository<IPatientAddressRepository>(); foreach (var address in entity.Addresses) { addressRepo.Update(address); } _dataReposit

我在视图中显示父实体及其子实体,并允许用户编辑父实体和子实体

当用户单击save时。仅修改父实体,而忽略子实体。我的工作就是这样

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);
var addressRepo=\u dataRepositoryFactory.GetDataRepository();
foreach(entity.Addresses中的var地址)
{
地址更新(地址);
}
_dataRepositoryFactory.GetDataRepository().Update(entity.Contact);
var guardianRepo=_dataRepositoryFactory.GetDataRepository();
foreach(实体中的var监护人。监护人)
{
《卫报》更新版(卫报);
}
_dataRepositoryFactory.GetDataRepository().Update(entity.Demographic);
返回_patientRepository.Update(实体);

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

我记得在一次性更新父实体和子实体时,会遇到类似的问题。我没有真正花时间去弄清楚确切的原因,但我很快意识到,通过大量的修改将大型模型传回可能不是最好的模型。在一个极端情况下,我的帖子太大了,超过了默认的邮件大小

我喜欢这样更新大型父/子模型的方法是将整个父/子模型向下传递到页面,然后通过ajax分别更新每个子模型。因此,父对象和子对象永远不会在同一操作中更新。这也使得处理错误变得更容易,如果你向上传递了一个庞大的模型,而一个子模型没有通过验证,那么有时在集合中以用户显而易见的方式将错误传递回去可能会很困难。然而,对于用户来说,执行单个更新总是更容易发现/处理

我建议您使用视图模型,而不是直接将实体传递到视图中,这对于除最简单视图外的所有视图都是不好的做法。您可以缩小模型以减少视图的负载,也可以在将来轻松扩展视图模型以添加额外功能,而不会影响实体


只是一些想法,希望能有所帮助。

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

  • 将根实体附加到上下文,以在整个图中启用更改跟踪
  • 这会将整个对象图标记为EntityState。未更改,因此需要遍历图并相应地设置状态
  • 将父实体标记为
    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方法中,该方法知道如何基于图的根实体“绘制对象图的状态”

    例如

    公共类MyRepository
    {
    修改的公共无效附件(实体)
    {
    _上下文。附加(实体);
    _context.Entry(entity.State=EntityState.Modified;
    _context.Entity(Entity.ChildEntity1).State=EntityState.Modified;
    //等
    _SaveChanges();
    }   
    }
    
    <> P>如果您需要考虑子实体的插入或删除,则会有额外的复杂性。这些操作归结为加载根实体及其子实体的当前状态,然后将子集合与更新的根实体上的集合进行比较。然后将状态设置为
    EntityState.删除的
    EntityState.添加的
    取决于集合的重叠


    注意:代码直接输入到浏览器中,因此可能/将有一些输入错误。

    请共享您的患者类别定义和IPatientRepository实现。EF6“context.attach”已不存在此解决方案。。。有什么建议吗?可能的解决方案:T dbEntity=await Get(entity.Id);条目(dbEntity).UpdateFrom(entity);SaveChanges()。。。未经测试。
    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();
        }   
    }