EF4.1正在更新具有ICollection属性的子项的数据

本文关键字:属性 数据 ICollection 更新 EF4 | 更新日期: 2023-09-27 18:00:16

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

对于INSERT情况,EF会自动保存子数据,但对于Updating情况则不会。

所以我选择了手动更新,但我想有一种自动更新的方法,我只是不知道。

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

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.
}

EF4.1正在更新具有ICollection属性的子项的数据

由于您没有直接附加所选的并将其标记为脏,EF无法在不丢失数据库中原始值的情况下检测到它们的更改。

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

根据您的代码,我假设update()方法是将实体标记为脏的方法。