2012-03-05 46 views
0

我有这个场地对象:子对象是否应该在Entity Framework 4 Code-First中自动更新?

public class Venue 
{ 
    public int Id { get; set; } 

    [Required] 
    [MaxLength(512)] 
    public string Name { get; set; } 

    public string Description { get; set; } 

    [Required] 
    [Display(Name = "Venue Type")] 
    public int VenueTypeId { get; set; } 
    public virtual VenueType VenueType { get; set; } 

    [Required] 
    [Display(Name = "Company")] 
    public int CompanyId { get; set; } 
    public virtual Company Company { get; set; } 

    public virtual ICollection<VenuePart> VenueParts { get; set; } 
} 

正如你所看到的,它有VenuePart个集合。我将Venue发送到视图,并将VenuePart的集合作为文本框的表格输出。这会被回传至Edit(VenueDetailsViewModel venueDetailsViewModel)。使用调试器,我可以验证我的更改是否在VenuePart的集合中,所以我认为我们很擅长绑定。我的控制器试图更新Venue。它直接在对象上成功执行属性,例如Name。但是,除非循环访问集合,否则不会更新这些对象。这是典型的行为吗?

unitOfWork.VenueRepository.Update(venueDetailsViewModel.Venue); 
// Should this loop be necessary? 
foreach (var venuePart in venueDetailsViewModel.Venue.VenueParts) 
{ 
    unitOfWork.VenuePartRepository.Update(venuePart); 
} 
unitOfWork.Save(); 

此刻,我甚至担心列表或东西,从列表中消失了(虽然这就是我下一个攻坚)处理新的东西。对于我的第一步,我只想更新列表。是否有必要遍历集合并更新每个单独的对象?如果我不这样做,他们不会保存。但似乎他们应该没有我的循环。我的期望是否过高或者我做错了什么?

我的repositoryunitOfWork对象在this tutorial之后形成图案,如果您好奇该代码的外观如何。

回答

1

这是因为unitOfWork.VenueRepository.Update(venueDetailsViewModel.Venue);将在Unchanged状态附加对象图并且只将venue更改为Modified。一个替代方案是将foreach循环移动到VenuePartRepository.Update方法。

如果允许的VenueParts元素从UI添加或删除你将不得不申请改变很难。如果是这样的话,你将不得不加载集合中的数据库和比较,与即将到来的变化。然后手动更改VenuePart各州AddedDeleted

+0

听起来很合理。我会尝试将其移入存储库中的建议。 – Chris 2012-03-05 07:20:15

相关问题