使用实体框架的复杂关系映射

时间:2012-06-23 20:38:40

标签: c# database entity-framework

我有这个数据库

Packages (packageID, package_name , .... )
PackageVariant (packageID, variantID)
Variant (variantID, variant_name, .... )
VariantProduct (variantID, productID, quantity)
Product (productID, product_name, .... )

我已在实体框架中对其进行了建模,我不知道多重性,但它们应基于以下内容:

包可以包含无变量或多变量 变体只能与一个包相关联(不能为无或多个) 一个变体可以有一个或多个产品
产品与无变体或多变量相关联

删除包时,必须删除该包的所有变体 删除Variant时,不需要删除任何其他内容 删除产品时,需要删除与变体的所有关联。

如果您可以提供有关多重性的帮助,以及需要设置OnDelete:Cascade的位置,那就太棒了!

我还需要能够做到这一点:

var ptx = new MyEntities();
Variant newVariant = new Variant()
{
    setRelevantProperty = value
};
Product selectedProduct = ptx.Products.First(o => o.productID == productID);
newVariant.Products.Add(selectedProduct);
Package packageToAddVariantTo = ptx.Packages.First(o => o.packageID == packageID);
packageToAddVariantTo.Variants.Add(newVariant);
ptx.SaveChanges();

没有因“没有插入,更新集”或其他任何依赖映射的错误而导致错误。那么如何正确映射这个复杂的数据库会很好:)

我看了几篇帖子,书籍,我似乎无法找到答案。

由于

1 个答案:

答案 0 :(得分:0)

Lee O得到了答案,我只是将其作为答案发布,而不是评论读者的清晰度:

我不确定你的问题的答案,但我会提出一个建议,摆脱PackageVariant表。当你有多个到多个关系时,你只需要一个这样的表。只需在变量表中添加一个名为packageId的列,并使其成为包表的外键,而不是null。这将根据变体强制执行1个包的规则。但是每个包都没有多个变体。

谢谢李