C#EntityFramework递归泛型模型引用

时间:2017-06-16 05:22:03

标签: c# entity-framework recursion recursive-datastructures

作为介绍,我想给你以下示例

想象一下,你有不同的口味,例如,StrawberryRaspberry,......他们自己都是“纯粹的”。

现在你想要制作一种味道,它本身就是其他口味的复合物,例如Fruity由两种风格StrawberryRaspberry组成,每种风格加权50%。

现在让我们假设你想在炎热的夏天添加一些Mint来制作一个更新的版本。您创建了一个由Fresh n' FruityFruity两种风格组成的风格Mint,分别加权80%和20%。

这种递归引用的概念是我试图通过EntityFramework 6.1.3上的CodeFirst方法实现的。

根据我的理解,数据库架构应该看起来像这样:UML Database Schema

尝试在代码中表示 我提出了以下构造:

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的泛型类的派生类。他们看起来像这样

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> { }

派生part类的原因是因为Entity Framework无法处理泛型类,并且我有多个具有这种部分机制的不同类。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好吧,在经过一些测试和新想法之后,我想出了这个:

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

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

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

并在Part

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

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

这将生成如问题

中所示的数据库

我希望这有助于某人