我有一个具有ICollection属性的EF Code First模型。
public class AccountProfile
{
[Key]
public int AccountID { get; set; }
public string AccountName { get; set; }
public string Email { get; set; }
[Required]
public virtual ICollection<UserProfile> LinkedUserProfiles { get; set; }
}
我正在将编辑视图绑定到此模型,但它只显示AccountName和Email属性。
我有一个HttpPost ActionResult来更新带有AccountProfile的模型。
发布时,AccountProfile对象仅填充AccountName和Email属性。 LinkedUserProfiles为null。这意味着无法更新模型,因为需要LinkedUserProfiles属性。
我也尝试了以下没有运气的事情
var curAccountProfile = _accountProfileRepository.GetById(accountProfile.AccountID);
TryUpdateModel(curAccountProfile);
我做错了什么?如何在MVC中处理这种情况?
更新 数据来自存储库,例如。
var accountProfile = _accountProfileRepository.ById(1);
return View(accountProfile);
在加载视图之前检查accountProfile对象会显示正在检索该集合 - 因此不会出现延迟加载不能按预期工作的情况。
我已经实现了AutoMapper,为视图创建了一个ViewModel,并将我的代码更改为:
var accountProfile = _accountProfileRepository.ById(accountInformation.AccountID);
var result = _mappingEngine.Map<DisplayAccountInformationViewModel, AccountProfile>(accountInformation, accountProfile);
_unitOfWork.Commit();
它现在正如预期的那样运作 - 但它看起来比应该的更多努力?
答案 0 :(得分:0)
尝试急切加载 LinkedUserProfiles
:
var curAccountProfile = _accountProfileRepository
.GetById(accountProfile.AccountID)
.Include(ap => ap.LinkedUsedProfiles);
看起来您正在使用存储库模式,因此不确定如何处理预先加载。我的存储库返回IQueryable<T>
,Include
扩展方法可以解决这个问题。
如果您没有使用IQueryable<T>
,那么您可能需要在存储库中进行预先加载(例如接受布尔标志,例如:GetById(int id, bool include profiles
)。