如何防止 EF 创建外键?

How to prevent EF from creating a foreign key?

我有两个 tables 租户和语言。租户有一个 属性 用于默认语言,第二个 属性 用于可能的替代语言列表(包括默认语言)。语言 table 只是所有可能语言选项列表的参考 table。它不需要包含任何其他 table 的任何信息。在尽我所知配置 EF 后,它会在语言 table.

中创建一个 TenantId 外键

我的配置导致了这个问题,我该如何阻止它?

租户配置:

public class TenantConfiguration : EntityConfiguration<Tenant>
{
    public override void Configure(EntityTypeBuilder<Tenant> builder)
    {
        base.Configure(builder);

        builder.HasOne(tenant => tenant.RootFolder).WithMany().OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.ClientCascade); //unsure
        builder.HasMany(tenant => tenant.Languages).WithOne().OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.NoAction);
        builder.Property<Guid>("DefaultLanguageId");
        builder.HasOne(tenant => tenant.DefaultLanguage).WithMany().OnDelete(Microsoft.EntityFrameworkCore.DeleteBehavior.NoAction);
    }
}

语言配置:

public class LanguageConfiguration : EntityConfiguration<Language>
{
    public override void Configure(EntityTypeBuilder<Language> builder)
    {
        base.Configure(builder);
    }
}

实体模型:

public abstract class Entity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual Guid Id { get; set; }
    
    public virtual DateTime Created { get; set; }
    
    public virtual DateTime Updated { get; set; }
}

租户模型:

[Table("Tenant")]
public class Tenant : Entity
{
    [Required]
    public virtual string Name { get; set; }
    
    [Required]
    public virtual Folder RootFolder { get; set; }

    [Required]
    public virtual IList<Language> Languages { get; set; }

    [Required]
    public virtual Language DefaultLanguage { get; set; }
}

语言模型:

[Table("Language")]
public class Language : Entity
{
    [Required]
    public virtual string Name { get; set; }
}

这里是生成的,不正确schema

编辑: 我希望架构看起来像 this。租户 table 将在语言 table 中保存对 Id 的引用。语言不应该知道哪些租户引用了它们。

发生这种情况是因为您在 Tenant 模型中创建了 属性 Languages 作为 list。关系数据库中的列表不存在。您不能拥有包含多个值的属性。 EF 执行以下操作:它查看 IList<Language> Languages 属性。然后它转到 Language 模型并添加外键属性 linked 到 Tenant 模型。

看了你的解释后,你似乎想建立一个 N:M 关系,因为你想 link 多种 语言 租户。为此,您需要 Associative entity (junction table)。这是因为您试图在两个表之间建立 N:M(多对多)关系。