EF中的关系



我是实体框架的新手,我只是不知道在代码优先的方法中关系是如何工作的。

例如,考虑三个实体:UsersPicturesPosts

  • 一个用户可以拥有多张图片
  • 一篇帖子可以有多张图片

从数据库的角度来看,这是3个表+2个连接表(UserPicturesPostPictures(。

到目前为止,我还没有在数据库中创建外键关系:

[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中,您可以自由省略外键属性和链接表,它们将在后台处理。

如果您不喜欢默认的基于约定的配置,可以使用基于代码或属性的配置来修改对象到数据库的映射。

最新更新