当我在数据库中保存对象然后检索保存的对象时,它会显示所有空子对象。
我使用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;
}
答案 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类,对我的映射器,存储库进行了更改,并将作为类的对象的属性拆分为不同的声明,并将它们一一保存。所有这些都设法解决了,但我不知道是什么。