Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存更改后EF核心引用为空_C#_Entity Framework Core - Fatal编程技术网

C# 保存更改后EF核心引用为空

C# 保存更改后EF核心引用为空,c#,entity-framework-core,C#,Entity Framework Core,我使用以下版本的EF Core: Microsoft.EntityFrameworkCore.Sqlite 5.0.0-rc.2.20475.6 我有以下课程: 公共级车库 { 公共int Id{get;set;} 公共列表车辆{get;set;}=new List(); } 公车 { 公共int Id{get;set;} } 公共级法拉利:汽车 { 公共特殊{get;set;} } 公务舱 { 公共int Id{get;set;} } 公共类MyContext:DbContext { 配置时

我使用以下版本的EF Core:

Microsoft.EntityFrameworkCore.Sqlite 5.0.0-rc.2.20475.6
我有以下课程:

公共级车库
{
公共int Id{get;set;}
公共列表车辆{get;set;}=new List();
}
公车
{
公共int Id{get;set;}
}
公共级法拉利:汽车
{
公共特殊{get;set;}
}
公务舱
{
公共int Id{get;set;}
}
公共类MyContext:DbContext
{
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
optionsBuilder.UseSqlite($“Filename=my.db”);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().ToTable(“车库”);
modelBuilder.Entity().ToTable(“汽车”);
modelBuilder.Entity().ToTable(“法拉利”);
modelBuilder.Entity().ToTable(“特殊”);
}
}
我有以下代码:

使用var context=new MyContext()等待;
等待context.Database.EnsureCreatedAsync();
var garage=新车库();
添加(车库);
wait context.saveChangesSync();
var法拉利=新法拉利();
车库。汽车。添加(法拉利);
ferrari.Special=新的Special();
WriteLine($“特殊引用为空:{(ferrari.Special==null?“是”:“否”)});
wait context.saveChangesSync();
WriteLine($“特殊引用为空:{(ferrari.Special==null?“是”:“否”)});
对“特殊”的引用将为空。结果如下:

Special is null: NO
Special is null: YES
你可以自己试试:

在数据库中一切正常。你知道如何解决这个问题吗?还是只是一只虫子


它可以与派生类相关。如果您将特殊属性从法拉利移动到汽车中,它会工作。

这是因为当您使用context.Add metod时,您正在添加的对象会被标记为Added,并且在您调用save时会被保存。当您将对象添加到另一个对象时,调用save时,该对象不会被标记为已添加,也不会被上下文忽略。您必须向Car类添加GarageId属性。如果你没有一个车库,它就永远不会正常工作。但在这种情况下,车库类根本没有任何意义。并将法拉利与汽车级别合并。否则,您将需要一个特殊的表和很多问题,使其工作

试试这个:

var garage = new Garage () ;
var ferrari = new Ferrari();
ferrari.Special = new Special();
garage.Cars.Add(ferrari);

Console.WriteLine($"Special reference is null: {(ferrari.Special == null ? "YES" : "NO")}")

context.Add(garage);
await context.SaveChangesAsync();

Console.WriteLine($"Special reference is null: {(ferrari.Special == null ? "YES" : "NO")}");

这是一个确认的错误。修复程序应可从5.0.1版获得

将存储生成的值传播到FK时,由于#22603,我们将FK存储生成的值设置为null。当接受这些值时,我们用“存储生成”null覆盖传播的值。在TPH中,此时法拉利条目中没有存储生成的值,因此我们不必将其重置为null,但是在TPT中,首先插入汽车零件,这会触发存储生成的侧车的创建,从而导致上述情况。 -安德烈·斯维里德


好的,它看起来还取决于何时调用SaveChanges。这种行为是故意的吗?我应该只在某些情况下调用SaveChanges吗?在您的第二个示例中,您在法拉利上设置了GarageId,但该属性不存在。另外,两个示例中都有错误,无法编译。没关系,谢谢你的帮助。请出示你的车库和汽车类别,我会把外键的名字修好。我不得不猜测你们的数据结构。好吧,把法拉利加入到上下文中有帮助。谢谢我会更多地测试它,然后回来。我认为跟踪变化应该注意这一点。这就是为什么我没有添加其他实体。对不起,我刚刚检查了你的链接,请阅读我的最新更新,如果你没有车库,请将GarageId添加到汽车中。但在这种情况下,车库类根本没有任何意义。
var garage = new Garage();

context.Add(garage);

await context.SaveChangesAsync();

var ferrari = new Ferrari( GarageId=garage.Id);
ferrari.Special = new Special();

context.Add(ferrari);

Console.WriteLine($"Special reference is null: {(ferrari.Special == null ? "YES" : "NO")}");

await context.SaveChangesAsync();

Console.WriteLine($"Special reference is null: {(ferrari.Special == null ? "YES" : "NO")}");