Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于实体框架的复杂关系映射_C#_Database_Entity Framework - Fatal编程技术网

C# 基于实体框架的复杂关系映射

C# 基于实体框架的复杂关系映射,c#,database,entity-framework,C#,Database,Entity Framework,我有这个数据库 Packages (packageID, package_name , .... ) PackageVariant (packageID, variantID) Variant (variantID, variant_name, .... ) VariantProduct (variantID, productID, quantity) Product (productID, product_name, .... ) 我在实体框架中对其进行了建模,我不知道多样性,但它们应基于以

我有这个数据库

Packages (packageID, package_name , .... )
PackageVariant (packageID, variantID)
Variant (variantID, variant_name, .... )
VariantProduct (variantID, productID, quantity)
Product (productID, product_name, .... )
我在实体框架中对其进行了建模,我不知道多样性,但它们应基于以下内容:

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

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

如果您可以提供有关多重性的帮助,以及需要设置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();
不会因为“没有插入、更新集”或任何其他依赖于映射的内容而出现错误。因此,如何正确映射这个复杂的数据库将是一件好事:)

我读过一些帖子和书,但似乎找不到答案


谢谢

Lee O得到了答案,为了让读者更清楚,我将其作为答案而不是评论重新发布:


我不确定你的问题的答案,但我有一个建议,去掉PackageVariant表。只有在具有多对多关系时才需要这样的表。只需在variant表中添加一个名为packageId的列,并将其作为package表的外键,且不为null。这将严格执行您的规则,即每个变量有一个包。但每个软件包没有多个变体


感谢Lee

这是我目前的错误提示“无法更新EntitySet'PackageVariant',因为它有一个定义查询,并且元素中不存在支持当前操作的元素。”您是否在EDMX设计器中运行了“从数据库更新模型”(因为您“有一个数据库”)?那么“你做了什么模型”呢?还是先使用代码?还是型号优先?packagevariant是视图还是表?如上所述的packagevariant是表。我不明白你在说什么Slauma,我创建了一个数据库,然后用实体模型对数据库的概念进行建模。我不确定你的问题的答案,但我有一个建议,去掉PackageVariant表。只有在具有多对多关系时才需要这样的表。只需在variant表中添加一个名为packageId的列,并将其作为package表的外键,且不为null。这将严格执行您的规则,即每个变量有一个包。但每个软件包没有多个变体。