【问题标题】:EF中的关系?
【发布时间】:2023-03-15 10:50:01
【问题描述】:

我是 Entity Framework 的新手,我只是无法弄清楚关系在代码优先方法中是如何工作的。

例如,考虑三个实体: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 表并将路径放在联结表条目中?

【问题讨论】:

  • 这确实创建了一个具有 FK 关系的数据模型。图片表中有两个 FK,一个给 User,一个给 Post。这是一个可行的模式。您不需要连接表。

标签: c# sql entity-framework entity-framework-core entity-framework-6


【解决方案1】:

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 中,您可以随意省略外键属性和链接表,它们将在幕后进行处理。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多