EF4.1使用ICollection属性的子级更新数据

时间:2013-02-20 22:09:14

标签: c# entity-framework

我正在尝试使用Entity Framework和ICollection子属性更新数据库数据。

对于INSERT案例,EF会自动保存子数据,但不适用于更新案例。

所以我做了手动更新,但我想有一种方法可以自动更新,我不知道。

请查看我的代码,并给我建议

public class Parent
{
    [Key]
    public int ID {get; set;}   
    public string Name {get; set;}

    public virtual ICollection<Child> Children{ get; set; }
}

public class Child
{
    [Key]
    public int ID {get; set;}
    public int ParentID { get; set; }
    public string Name {get; set;}
}

// INSERT的控制器方法

public void InsertTest(){
    //generate new Parent Data with child
    Parent parent = new Parent() { 
        Name = "Nancy"
    };

    parent.Children.Add(new Child()
    {
        Name = "First Son"
    });

    parent.Children.Add(new Child()
    {
        Name = "Second Son"
    });

    var parentRepository = unitofwork.parentRepository;
    parentRepository.insert(parent); //context.Set<Parent>().Add(parent);
    unitofwork.Save();
    // it save child entity well
}

// UPDATE的控制器方法

public void UpateTest()
{
    //generate new Parent Data with child
    Parent parent = new Parent()
    {
        ID = 1,
        Name = "Nancy"
    };

    parent.Children.Add(new Child()
    {
        ID = 1,
        ParentID = 1,
        Name = "First Son Renamed"
    });

    parent.Children.Add(new Child()
    {
        ID = 2,
        ParentID = 1,
        Name = "Second Son"
    });

    // add new data
    parent.Children.Add(new Child()
    {
        Name = "Third Son"
    });

    var parentRepository = unitofwork.parentRepository;
    parentRepository.update(parent); //context.Set<Parent>().Attach(entityToUpdate); context.Entry(entityToUpdate).State = EntityState.Modified;
    unitofwork.Save();
    // it save parent data, but it does not change any for child data

    // *** To make work, I did like this, ***
    // var childRepository = unitofwork.childRepository;
    //foreach (Child c in parent.Children.ToList())
    //{
    //    if (c.ID < 1)
    //    {
    //        childRepository.update(c);
    //    }
    //    else
    //    {
    //        childRepository.insert(c);
    //    }
    //}

    //unitofwork.Save();

    // then it works.
}

1 个答案:

答案 0 :(得分:1)

由于您没有直接附加所选内容并将其标记为脏,因此EF无法检测到它们已更改而不会从数据库中丢失其原始值。

从数据库中加载子项并将值注入其中(特别是如果您还想要删除列表中不再选择的项),或者使用工作单元将附加选中的附加项标记为已修改(较少的dB操作)但是,不会删除现有的孩子。)

从代码中我假设update()方法是将实体标记为脏的方法。