【问题标题】:Symmetric relationship in EF Code firstEF 代码中的对称关系优先
【发布时间】:2013-02-21 09:01:07
【问题描述】:

我不确定我的措辞是否正确(这可能是我努力寻找结果的原因)。

这是我想要达到的目标:

我希望能够将相关产品(产品 B、产品 C)的集合添加到产品 A。我希望这样当您查看产品 B 时,相关产品会反映在 A 上添加的内容(如您将看到的产品 A 和产品 C)。 是否必须为“相关”关系提供单独的表?我猜有一个简单的方法可以做到这一点。

public class Product
{
    public int ProductId { get; set; }
    public string DefinitionUri { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Product> RelatedProducts { get; set; }
}

【问题讨论】:

  • 这不只是ProductGroup 之类的产品分组吗? (所以,一个单独的实体)
  • 我并没有真正尝试为要放置的产品创建 ProductGroup。我希望管理员和算法都能够(对称地)关联产品并能够简单地访问它们(如中,我可以只访问 RelatedProducts 属性)并且高效(不需要每次访问该属性时都基于其他属性“查找”相关产品)。

标签: entity-framework ef-code-first code-first poco self-reference


【解决方案1】:

您可以按照定义的方式使用该属性,但您应该告诉 EF 它是多对多关联,例如像这样:

entry.HasMany(p => p.RelatedProducts)
     .WithMany()
     .Map(m => m.MapLeftKey("ProductId")
                .MapRightKey("ProductIdReleated"));

现在 Ef 将创建一个带有两个 FK 到 Product 的联结表。如果没有这个映射,它将创建一个带有 FK 的 Product 表,即 1-n 关联。

【讨论】:

    【解决方案2】:

    我猜你正在尝试做的事情类似于你在 amazon.com 上看到的内容,例如,如果你打开一本书,它会给你相关的书籍供你查看。如果我猜对了,那么这是您尝试配置的多对多关系,因为每个产品都可能与许多其他产品相关,现在 Entity Framework Code First 通过约定支持多对多关系并创建一个连接表自动地。现在我还没有尝试过两个相关对象的类型相同(在你的情况下是“产品”),所以你必须检查这是否可行。附带说明一下,我认为这不是实现此功能的方式,我认为您必须使用某种数据挖掘技术,我会为此谷歌,看看专业人士如何实现此功能。

    【讨论】:

    • 创建一个连接表并拥有一个非对称的“相关产品”关系很容易,但我希望它是对称的(我的第二段对此进行了讨论)。我将研究数据挖掘技术——但这对于我正在研究的一个相对较小的功能来说听起来有点可怕。不过谢谢!
    • @NickDarvey 您能找到满足您需求的答案吗?我有同样的问题,但还没有找到。上面 Gert Arnold 提供的解决方案正是“不对称”的情况,对吧?
    • @tyron 我没有再看这个,所以我没有找到解决方案,我现在离实体框架有点远,抱歉。
    • @tyron - 抱歉回复晚了。我想我放弃了这个想法。如果我现在必须实施它,Sniffer 所说的可能就是我会做的事情。这可能不是最有效的,但您可以通过多对多关系来实现(产品有很多产品)。您可以使用 EF 约定或手动创建将一个产品 ID 与另一个产品 ID 相关联的连接表。
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多