实体框架:在SaveChanges返回后,对象没有子节点

时间:2017-03-22 09:57:39

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

当我在数据库中保存对象然后检索保存的对象时,它会显示所有空子对象。

我使用Entity Framework 6并且我一直使用下面示例中显示的查询,并且它始终正常工作,但我不明白为什么此查询显示空子对象。

public car save_car(car data)
{
    if (data.id_car == 0)
    {                
        _contextDrag.car.Add(data);
        _contextDrag.SaveChanges();                          
    }
    else
    {
        _contextDrag.SaveChanges();
    }

    return data;
}

public car get_car(long id_car)
{            
    car data = _contextDrag.car.FirstOrDefault(a => a.idCar == id_car);            
    return data;
}

3 个答案:

答案 0 :(得分:2)

这是因为您重复使用_contextDrag进行多项操作。当您致电save_car时 - 已保存的汽车存储在上下文中。然后,当您致电get_car时,会返回相同的汽车实例。如果它的所有子属性都为null(例如是你要添加的新实体) - 它仍然会将所有子属性设置为null,并且延迟加载将不起作用,因为它与{{{}中的实体完全相同1}}。通常最好的方法是不要重复使用您的上下文。

答案 1 :(得分:0)

我在我的项目中应用的这个解决方案,它可以正常工作。

我使用了System.Data.Entity.EntityState.Detached

public car save_car(car data)
{
    if (data.id_car == 0)
    {                
        _contextDrag.car.Add(data);
        _contextDrag.SaveChanges();
        _contextDrag.Entry(data).State = System.Data.Entity.EntityState.Detached;
    }
    else
    {
       _contextDrag.SaveChanges();
    }

    return dades;
}

public car get_car(long id_car)
{            
   car data = _contextDrag.car.FirstOrDefault(a => a.idCar == id_car);            
   return data;
}

答案 2 :(得分:0)

我似乎也遇到了同样的问题,但我似乎不知道为什么。

当我在DataInitializer的末尾使用_context.SaveChanges()时,它将引发一个自定义错误,该错误是我为另一个对象中某个对象的设置器(在此处编写代码)编写的。

        public Locatie Locatie
        {
            get => _locatie;
            set
            {
                if (value is null)
                    throw new ArgumentException(Settings.locatieLeeg);
                else
                    _locatie = value;
            }
        }

但是,如果我摆脱了这个错误,它将转到下一个同时检查null的设置器。这使我相信一个对象的所有子对象都设置为null。以前这不是问题,现在是,我不确定为什么要诚实。

有什么理论吗?

编辑:控制台的输出卡在这里:

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (52ms) [Parameters=[@p0='?' (Size = 100), @p1='?' (Size = 4000), @p2='?' (Size = 100), @p3='?' (Size = 6), @p4='?' (Size = 100)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      INSERT INTO [Locatie] ([Gemeente], [Huisnummer], [Land], [Postcode], [Straat])
      VALUES (@p0, @p1, @p2, @p3, @p4);
      SELECT [LocatieId]
      FROM [Locatie]
      WHERE @@ROWCOUNT = 1 AND [LocatieId] = scope_identity();
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (31ms) [Parameters=[@p5='?' (Size = 320), @p6='?' (DbType = Int32), @p7='?' (Size = 14)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      INSERT INTO [ContactPagina] ([Email], [LocatieId], [Telefoonnummer])
      VALUES (@p5, @p6, @p7);
      SELECT [ContactPaginaId]
      FROM [ContactPagina]
      WHERE @@ROWCOUNT = 1 AND [ContactPaginaId] = scope_identity();

答案:

我以某种方式设法解决了该问题,但我不知道如何解决。我清理了ApplicationDataInitializer类,对我的映射器,存储库进行了更改,并将作为类的对象的属性拆分为不同的声明,并将它们一一保存。所有这些都设法解决了,但我不知道是什么。