C# 实体框架:保存更改后返回的对象不';我没有孩子
当我在数据库中保存一个对象,然后检索保存的对象时,它会显示所有空的子对象C# 实体框架:保存更改后返回的对象不';我没有孩子,c#,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Entity Framework 6,当我在数据库中保存一个对象,然后检索保存的对象时,它会显示所有空的子对象 public car save_car(car data) { if (data.id_car == 0) { _contextDrag.car.Add(data); _contextDrag.SaveChanges(); } else { _conte
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;
}
我使用EntityFramework 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;
}
这是因为对多个操作重用了
\u contextDrag
。调用save\u car
时,已保存的汽车存储在上下文中。然后调用get\u car
-返回相同的car实例。如果它的所有子属性都为空(例如,您正在添加的是was new实体),那么它的所有子属性都将为空,并且延迟加载将不起作用,因为它与您在save\u car
中的实体完全相同。像往常一样,最好的方法是永远不要重复使用您的上下文。我在项目中应用了这个解决方案,它工作正常
我使用了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;
}
我似乎也有类似的问题,但我似乎不明白为什么 当我在DataInitializer的末尾使用_context.SaveChanges()时,它会抛出一个自定义错误,这是我为另一个对象中的一个对象的setter(下面的代码)编写的
public Locatie Locatie
{
get => _locatie;
set
{
if (value is null)
throw new ArgumentException(Settings.locatieLeeg);
else
_locatie = value;
}
}
但是,如果我消除了错误,它只会转到下一个setter,该setter也会检查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类,对映射器、存储库进行了更改,并将作为类对象的属性拆分为不同的声明,并逐个保存。所有这些都设法解决了问题,但我不知道是什么。看来你是.Net世界的新手,请查看新帖子的代码约定谢谢你的帮助,到目前为止,使用相同的上下文和执行相同的过程都没有问题,先保存了一个对象,然后再次检索。你很幸运,但是如果您继续这样做,您将遇到更多令人惊讶和难以调试的问题。您是否更新了db连接器?我曾经在更新Mysql.Data.Entity连接器时遇到过这种类型的问题。我最后不得不回到以前的版本。事实并非如此。谢谢你的回答。