我有一个关于 EF core 中外键的问题。假设我有这个:
public class User
{
public int UserID{get;set;} // PK
}
public class Workout
{
public int WorkoutID{get;set;} // PK
public int UserID{get;set;}//FK, the userid that created this workout
}
这对我来说已经足够了。因为如果您需要获取创建锻炼 X 的用户,您可以在您创建的某些服务/存储库中使用 LINQ 一行完成。
我尝试学习 EF core 中的外键,在每个示例中我都看到它看起来像这样:
public class Workout
{
public int WorkoutID{get;set;} // PK
public int UserID{get;set;}
[ForeignKey("UserID")]
public User User{get;set;} // navigation property
}
这到底有什么作用以及它如何更好?当你只能保留 ID 时,在模型中再保留一个字段对我来说感觉很糟糕。有什么区别?
我对数据库还是个新手,有一些同理心。谢谢!
导航属性的好处
var workouts = context.Workouts.Include(w => w.User).ToList();
这将在单个查询中加载所有锻炼及其相应的用户。
预加载:导航属性使您能够通过 Include 方法使用预加载,这对于通过在单个查询中获取相关数据来优化数据库访问非常有用。
更好的代码可读性:访问相关实体直接提高代码可读性。您可以执行以下操作,而不必手动执行连接:
var user = workout.User;
更改跟踪:EF Core 旨在与导航属性良好配合,从而更轻松地管理相关实体状态。当您修改锻炼的用户属性时,EF 可以更有效地跟踪更改。
关系定义:通过定义导航属性,您还可以使数据模型更具表现力。它清楚地表明了实体之间的关系,这对于其他任何人(或将来的您自己)阅读代码都有帮助。