C# EntityFramework 递归通用模型引用

C# EntityFramework recursive generic model referencing

作为介绍,我想给你下面的例子

假设您有不同的口味,例如,StrawberryRaspberry、...它们本身就是 'pure'。

现在您想制作一种口味,它本身就是其他口味的混合物,例如FruityStrawberryRaspberry 两种口味组成,各占 50%。

现在假设您想通过在炎热的夏天添加一些 Mint 来制作一个更新鲜的版本。您创建了一种风味 Fresh n' Fruity,它由两种风味 FruityMint 组成,权重分别为 80% 和 20%。

递归引用的概念是我在 EntityFramework 6.1.3.

上使用 CodeFirst 方法尝试实现的

据我所知,数据库模式应该看起来像这样:


试图在代码中表示这个我想出了以下结构:

public class Flavor
{
    [Key]
    public Int32 FlavorId { get; set; }

    [Required]
    [MinLength(3)]
    [MaxLength(64)]
    public String Name { get; set; }

    public virtual ICollection<PartFlavor> Parts { get; set; }
}

它引用了 PartFlavors 的集合,它是从名为 Part 的通用 class 派生的 class。他们看起来像这样

public abstract class Part<T>
{
    [Key]
    public Int32 PartId { get; set; }

    [Required]
    public Double Weight { get; set; }

    [Required]
    public virtual T Component { get; set; }
}

public class PartFlavor : Part<Flavor> { }

导出部分 class 的原因是因为 Entity Framework 无法处理通用 classes 而我有多个不同的 classes 具有这种部分机制。


我的问题是这段代码没有按照我希望的方式映射到数据库中。确切地说,没有生成交叉引用table。

有什么建议吗?

好吧,经过更多测试和新想法后,我想到了这个:

模型 Flavor 现在定义了这些属性:

    [InverseProperty("Component")]
    public virtual ICollection<PartFlavor> Parts { get; set; }

    [InverseProperty("PartOf")]
    public virtual ICollection<PartFlavor> Variants { get; set; }

并在 Part class

    [Required]
    [InverseProperty("Parts")]
    public virtual T Component { get; set; }

    [InverseProperty("Variants")]
    public virtual ICollection<T> PartOf { get; set; }

这会生成如问题中所示的数据库

我希望这对某人有所帮助