Mik*_*iaz 4 asp.net-mvc entity-framework
我在我的视图中显示Parent实体及其子项,并使用户能够编辑父实体和子实体.
当用户点击"保存"时.只有在忽略子实体时才会修改父实体.我的工作就是这个.
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);
Run Code Online (Sandbox Code Playgroud)
有更好的方法来更新所有子实体吗?
将更新应用于断开连接的实体时的标准模式如下:
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();
}
Run Code Online (Sandbox Code Playgroud)
这通常被封装在您的存储库中的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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要考虑插入或删除子实体,则会有额外的复杂性.这些归结为加载根实体及其子实体的当前状态,然后将子集与更新的根实体上的集进行比较.然后将状态设置为EntityState.Deleted或EntityState.Added取决于集合的重叠.
NB代码直接输入浏览器,因此可能/将会有一些拼写错误.
| 归档时间: |
|
| 查看次数: |
8222 次 |
| 最近记录: |