Entity Framework Core:填充关系导航属性

3

在 .NET 6 和 Entity Framework Core 6 中,通过设置外键值并调用 SaveChanges 来填充关系导航属性是否可行?

我尝试过,但似乎不起作用。虽然反过来的方式完美地工作(如果我将导航属性设置为相关实体)。

截图:

设置外键

保存更改后,“department”属性仍为空

尝试此操作时,调用 SaveChanges 后,student.department 仍为空。

var student = db.Students.Find(9);
student.departmentId = 1;
db.SaveChanges();

如果我这样做,调用SaveChanges后,外键student.departmentId会被填充:

var student = db.Students.Find(9);
student.department = db.Departments.Find(1);

db.SaveChanges();

尝试在查询学生实体时使用.Include()方法,以加载部门。 - Manuel Fabbri
@ManuelFabbri 尝试过了...在获取时,Include 只会获取相关实体,但在更新模型时不会产生任何影响。 - sj_7
所以我猜你应该在将外键更改为Department后,从上下文中重新加载实体。 - Manuel Fabbri
2个回答

3

尝试保存更改后,学生.department仍然为空

设置外键值不会加载相关部门。通常直接设置外键的用例是为了避免实际加载相关实体。

如果您想要加载相关实体,那么您可以查询它并将其分配给导航属性。

在实体上设置外键属性后,如果您想要加载相关实体,则可以使用显式加载。例如:

db.Entry(student).Reference(b => b.Department).Load();

Browne,这正是我所想的,但我只是想确保一下,因为在mvc 4/5中使用linq to sql以前是可以实现的...无论如何,谢谢伙计。 - sj_7

1

SaveChanges方法不会自动加载关联数据,除非上下文已经在跟踪相应实体(EF Core中的更改跟踪)。除了使用其中一种加载相关数据的选项(例如@David Browne在他的答案中提出的建议),还可以采用以下方法:

db.Departments.Find(1);
var student = db.Students.Find(9);
student.departmentId = 1;
db.SaveChanges(); // student.department will be filled here

甚至更好

var student = db.Students.Find(9);
student.departmentId = 1;
db.SaveChanges();
db.Departments.Find(1); // student.department will be filled here

你在第一段代码块中提到的解决方案与我提到的完全相同,但它并不能实现我真正想要的功能。它只是保存了具有正确外键的学生,但在SaveChanges()之后,Student中的Department对象并没有被填充。 - sj_7
1
@sj_7 抱歉,在复制粘贴时漏掉了一行。请查看更新。 - Guru Stron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接