【问题标题】:force the creation of an intermediate table `Blog_Post`强制创建中间表“Blog_Post”
【发布时间】:2021-04-17 17:18:09
【问题描述】:

有没有办法(ef-core-5.0)为以下代码强制创建中间表Blog_Post

Blog <= 0,n => Blog_Post <= 1,1 => Post

代码如下

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

    }
}

public class Blog
{
    public int Id { get; set; }
    public string Url { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
}

一方面,我想分离关注点,而不是在业务类中添加太多数据库内容。所以我宁愿不要尽可能多地使用显式数据库配置、属性、临时表类等,或者最好不要使用 Fluent 配置......

从另一个角度来看,博客和帖子之间没有多对多的关系。

但是,出于特定原因,必须在数据库中构建此类链接表。

【问题讨论】:

  • 你说的是多对多关系吗?
  • @insane_developer,一个或多个,其实无所谓,我只是想创建一个中间表。实际上一个博客可以有零个或多个帖子。但无论如何,应该创建一个表 Blog_Post。
  • 您可以这样做,但它需要您的类中的导航属性。我知道有一些多对多关系的示例,您可以在其中指定连接表的名称,甚至可以向其中添加更多字段。您可以尝试将这种方法用于一对多关系,就像博客和帖子的情况一样。但是,如果您想自己管理表,只需为其创建另一个实体并自行更新即可。

标签: c# .net entity-framework entity-framework-core ef-core-5.0


【解决方案1】:

使用 EFCore 5,如果您将 A - B 之间的关系声明为 .HasMany .WithMany EF 将自动创建连接表。如果您只想控制连接的创建/命名,您可以在.WithMany 之后使用.UsingEntity 来定义一个实体来概述连接。请注意,实体 A 仍然可以包含 ICollection&lt;B&gt;,而 B 分别包含 ICollection&lt;A&gt;,而不是 A_B。请参阅:https://dev.to/ruben_j/many-to-many-relations-in-entity-framework-core-3-1-and-5-59ei 大约 1/2 的方式他涵盖了 EF Core 5,包括 UsingEntity

如果您确实想要更多控制并公开 A_B 以便您可以拥有其他属性,则需要更新 A - B 之间的关系以使用 A_B 有效地形成一对多对一的形式导航:

public class A
{
    [Key]
    public int AId { get; set; }
    public virtual ICollection<AB> ABs { get; internal set; } = new List<AB>();
}

public class B
{
    [Key]
    public int BId { get; set; }
    public virtual ICollection<AB> ABs { get; internal set; } = new List<AB>();
}

[Table("A_B")]
public class AB
{
    [Key, Column(Order=0), ForeignKey("A")]
    public int AId { get; set; }
    [Key, Column(Order=1), ForeignKey("B")]
    public int BId { get; set; }

    public virtual A { get; set; }
    public virtual B { get; set; }
}

此方法允许您将其他列关联到 AB,例如跟踪 CreatedAt/By ModifiedAt/By 以了解何时创建/更新关联或其他属性。这样做不需要UsingEntity。这更符合 EF Core 5 之前如何在 EFCore 中创建多对多关系。

【讨论】:

  • 一方面,我想分离关注点,而不是在业务类上添加太多数据库内容。从另一个角度来看,Blog 和 Post 之间没有多对多的关系。但是,出于特定原因,必须在数据库中构建此类链接表。
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多