从模型中删除相关实体

时间:2014-10-17 03:04:29

标签: c# asp.net-mvc entity-framework entity-framework-6

我有一个MVC5 Code First EF6应用程序,其中包含以下模型(为了这个问题而简化)

public class AllocationHeader : IObjectWithState 
{
     private ICollection<AllocationLabourLine> _Labour { get; set; }
     public AllocationHeader()
     {
        _Labour = new List<AllocationLabourLine>();
     }
     public virtual ICollection<AllocationLabourLine> Labour
     {
        get { return _Labour; }
        set { _Labour = value; }
     }
}
public class AllocationLabourLine : IObjectWithState {}

每个AllocationHeader都有多个AllocationLabourLines ...我删除了所有其他属性,因为我认为它们与问题无关。

在我的创建页面上,我创建了一个具有预定义数量的AllocationLabourLines的AllocaitonHeader,并将模型返回到视图。

public ActionResult Create()
    {
        var allocation = new AllocationHeader() { AllocationDate = DateTime.Now.Date };
        for (int i = 0; i < 11; i++)
        {
            allocation.Labour.Add(new AllocationLabourLine());
        }
        GetJobs(null);
        return View(allocation);
    }

当模型被回发时,我处理分配中的Labor条目并尝试删除任何不包含EmployName的预生成条目,这些是未使用的。

// validate labour
var labourDel = new List<AllocationLabourLine>();

foreach (var l in entity.Labour)
{
    if (string.IsNullOrEmpty(l.EmployeeName))
    {
        // set entity to be removed as we cannot remove from collection during the foreach
        labourDel.Add(l);
    }
}
// remove items from collection
labourDel.ForEach(l => entity.Labour.Remove(l));

如果ModelState中存在错误,我们必须将更新的模型返回到页面,则使用了错误的值。

所以,如果这是数据条目

命名

  • 1
  • (空)
  • 2
  • 3

现在返回的数据如下所示,最后一行被删除而不是第二行

命名

  • 1
  • (空)
  • 2

如果我更新Validate Labor函数以从ModelState中删除人工条目,那么

// validate labour
var labourDel = new List<AllocationLabourLine>();
var count = 0;

foreach (var l in entity.Labour)
{
    var key = string.Format("Labour[{0}]", count);

    if (string.IsNullOrEmpty(l.EmployeeName))
    {
        // set entity to be removed as we cannot remove from collection during the foreach
        labourDel.Add(l);
        // remove from ModelState
        ModelState.Keys.Where(x => x.Contains(key)).ToList().ForEach(x => ModelState.Remove(x));
    }
    count++;
}
// remove items from collection
labourDel.ForEach(l => entity.Labour.Remove(l));

但是现在结果看起来像这样,仍然不理想,我们应该维护名称(1,2,3)

命名

  • 1
  • 2
  • 2

关于如何从集合中删除空白人工条目并保持正确值的任何想法。

注意:此时此数据不会保存到数据库中,我们仍然在创建页面上。

编辑:在count ++中添加;我遗漏的代码,但是在我的应用程序代码中。

0 个答案:

没有答案