如何仅通过ID正确定义多对多EF Core 2.2配置?

时间:2019-07-15 22:26:13

标签: c# entity-framework entity-framework-core

使用Entity Framework Core 2.2的项目包含一对具有多对多关系的实体。

实体如下:

class Feature
{
    int Id { get; set;}
}
class House
{
   int Id { get; set; }
   ICollection<int> FeatureIds { get; set; }
}

由于EF Core本身还不支持多对多关系,因此我创建了一个连接类。

class HouseFeature
{
    int FeatureId { get; set; }
    int HouseId { get; set; }
}

这三个类都不包含另一个实体的属性,仅包含其ID。 Feature实体都不包含houses的列表。

HouseFeature的配置类如下:

class HouseFeatureConfiguration : IEntityTypeConfiguration<HouseFeature>
{
    void Configure(EntityTypeBuilder<HouseFeature> houseFeatureConfiguration)
    {
    }
}

如何配置EF Core关系?

我发现的所有示例都需要Feature Feature { get; set; }上方的int FeatureId { get; set; }之类的属性。这些Feature Feature { get; set; }我没有用,所以我宁愿不要在模型中使用它们。仅具有id字段时,是否可以定义包括外键的关系?怎么样?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我认为您可以在不暴露模型中的链接类集合的情况下创建映射。但是,您可以将其设为私有。另外,到ICollection<int>的映射将不起作用(即使可以,这意味着没有链接对象集合的映射)。

也许您可以尝试这样的事情:

public class House
{
    [Key]
    public int Id { get; set; }
    private IEnumerable<HouseFeature> HouseFeatures { get; set; }

    public ICollection<int> FeatureIds
    {
        get { return HouseFeatures.Select((hf) => hf.FeatureId).ToList(); }
    }
}

class HouseFeatureConfiguration : IEntityTypeConfiguration<HouseFeature>
{
    public void Configure(EntityTypeBuilder<HouseFeature> builder)
    {
        builder.HasKey(nameof(HouseFeature.FeatureId), nameof(HouseFeature.HouseId));
        builder
            .HasOne<House>()
            .WithMany("HouseFeatures") // can't use nameof or expression because it's private member of the House
            .HasForeignKey(nameof(HouseFeature.HouseId));
        builder
            .HasOne<Feature>()
            .WithMany()
            .HasForeignKey(nameof(HouseFeature.FeatureId));
    }
}