我是实体框架的新手,我只是不知道在代码优先的方法中关系是如何工作的。
例如,考虑三个实体:Users
、Pictures
和Posts
。
- 一个用户可以拥有多张图片
- 一篇帖子可以有多张图片
从数据库的角度来看,这是3个表+2个连接表(UserPictures
,PostPictures
(。
到目前为止,我还没有在数据库中创建外键关系:
[Table("Users")]
public class User
{
[Key]
public int Id { get; set; }
[Required]
public string FirstName { get; set; }
public virtual ICollection<Picture> Pictures { get; set; } = new List<Picture>();
}
[Table("Pictures")]
public class Picture
{
[Key]
public int Id { get; set; }
[Required]
public string BlobPath { get; set; }
}
[Table("Posts")]
public class Post
{
[Key]
public int Id { get; set; }
[Required]
public string Title{ get; set; }
public virtual ICollection<Picture> Pictures { get; set; } = new List<Picture>();
}
我怎样才能做到这一点?或者我应该简单地删除通用的Pictures
表,并将路径放在连接表条目中?
EF将为多对多关系使用连接表,而仅为一对多使用外键。
区分两者的基本方法是在相关实体上放置反向导航属性,例如,如果您决定图片属于一个用户,但可以出现在多个帖子中,则
[Table("Pictures")]
public class Picture
{
[Key]
public int Id { get; set; }
[Required]
public string BlobPath { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Post> Posts{ get; set; } = new HashSet<Post>();
}
在EF Core中,您可以自由省略外键属性和链接表,它们将在后台处理。
如果您不喜欢默认的基于约定的配置,可以使用基于代码或属性的配置来修改对象到数据库的映射。