C# EntityFramework 递归通用模型引用
C# EntityFramework recursive generic model referencing
作为介绍,我想给你下面的例子:
假设您有不同的口味,例如,Strawberry
、Raspberry
、...它们本身就是 'pure'。
现在您想制作一种口味,它本身就是其他口味的混合物,例如Fruity
由 Strawberry
和 Raspberry
两种口味组成,各占 50%。
现在假设您想通过在炎热的夏天添加一些 Mint
来制作一个更新鲜的版本。您创建了一种风味 Fresh n' Fruity
,它由两种风味 Fruity
和 Mint
组成,权重分别为 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; }
这会生成如问题中所示的数据库
我希望这对某人有所帮助
作为介绍,我想给你下面的例子:
假设您有不同的口味,例如,Strawberry
、Raspberry
、...它们本身就是 'pure'。
现在您想制作一种口味,它本身就是其他口味的混合物,例如Fruity
由 Strawberry
和 Raspberry
两种口味组成,各占 50%。
现在假设您想通过在炎热的夏天添加一些 Mint
来制作一个更新鲜的版本。您创建了一种风味 Fresh n' Fruity
,它由两种风味 Fruity
和 Mint
组成,权重分别为 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; }
这会生成如问题中所示的数据库
我希望这对某人有所帮助