强制创建一个中间表"Blog_Post"



有没有办法(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; }
}

从一个方面来说,我希望将关注点分开,不要在业务类上添加太多DB内容。所以我宁愿不要尽可能多地使用显式的DB配置、属性、特别表类等,或者可能更好地使用Fluent配置。。。

另一方面,博客和贴子之间并没有多对多的关系。

然而,由于DB中的特定原因,需要构建这样的链接表。

使用EFCore 5,如果您将A-B之间的关系声明为.HasMany.WithManyEF将自动创建联接表。如果您只想控制连接的创建/命名,可以在.WithMany之后使用.UsingEntity来定义一个实体来勾勒连接的轮廓。注意,实体A仍然可以包含ICollection<B>,而B分别包含ICollection<A>,而不是A_B。请参阅:https://dev.to/ruben_j/many-to-many-relations-in-entity-framework-core-3-1-and-5-59ei大约过了一半,他掩护了包括UsingEntity在内的EF Core 5。

如果你确实想要更多的控制并公开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中创建多对多关系。

相关内容

  • 没有找到相关文章