如何防止 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(多对多)关系。
我有两个 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(多对多)关系。