我应该在两种配置中还是仅在一种配置中两次指定 EF Core 中的关系?

Should I specify a relationship in EF Core twice in both configurations or only in one?

我应该在两种配置中指定 EF Core 中的关系两次还是只在一种配置中指定?

例如我有这两个型号:

public class A 
{
   public int Id { get; set; }
   public int BId { get; set; }

   public B B { get; set; }
}

public class B 
{
   public int Id { get; set; }

   public ICollection<A> As { get; set; }
}

我有配置:

    public void Configure(EntityTypeBuilder<A> builder)
    {
        builder
            .HasKey(a => new { a.Id, a.BId });

        builder
            .HasIndex(a => new { a.Id, a.BId })
            .IsUnique()
            .IsClustered();

        builder
            .HasOne(a => a.B)
            .WithMany(b => b.As)
            .HasForeignKey(a => a.BId)
            .IsRequired(true);
    }

我现在还应该添加:

    public void Configure(EntityTypeBuilder<B> builder)
    {
        builder
            .HasKey(b => b.Id);

        builder
            .HasIndex(b => b.Id)
            .IsUnique()
            .IsClustered();

        builder
            .HasMany(b => b.As)
            .WithOne(a => a.B)
            .HasForeignKey(a => a.BId)
            .IsRequired(true);
    }

或者第一个配置是否足够(因此第二个配置无效)?

我在网上实在找不到这个问题的答案,所以我希望这里有人现在可以。

不,你不应该。

一个配置绝对够用

请参阅以下文档 link(简单博客示例):

https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    
    // Navigation properties
    public List<Post> Posts { get; set; }

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

     // Navigation properties
     public Blog Blog { get; set; }
 }

public class MyContext : DbContext
{
      public DbSet<Blog> Blogs { get; set; }
      public DbSet<Post> Posts { get; set; }
    
      protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
          modelBuilder.Entity<Post>()
                      .HasOne(p => p.Blog)
                      .WithMany(b => b.Posts);
        }
    }

如果您对显式配置不感兴趣,EfCore 有 4 个约定(无需配置)用于一对多关系。 以下link解释完整:

https://www.entityframeworktutorial.net/efcore/one-to-many-conventions-entity-framework-core.aspx