【问题标题】:Generic linked entity in entity framework实体框架中的通用链接实体
【发布时间】:2017-09-14 00:53:42
【问题描述】:

我正在开发一个应用程序,我需要针对模型中的每个实体存储 0、1 或多个 cmets 以及 0、1 或多个附件。

为此,我正在考虑开发一个具有以下列的实体:
id [pk] tableName tableId comment 1 'Order' 123 'This is some comment' 2 'Order' 123 'This is antoher comment' 3 'Order' 124 'This is comment to another order' 4 'Customer' 56 'This is comment linked to a customer'

因此,我可以将这个通用实体中的 cmets 与 tableName 和 tableId 字段链接起来,而不是为每个实体添加一个 commentId。

现在...当使用实体框架导航属性时,我并没有真正看到从我的 Invoice 或 Customer 表导航到正确记录的内置方式。这可以通过某种方式制作您自己的导航属性来实现吗?

如果没有.....有没有其他方法可以达到类似的结果。

谢谢!

【问题讨论】:

  • 只针对那些感兴趣的人:这正是 NHibernate 中的“任何类型”映射正在做的事情。

标签: .net c#-4.0 asp.net-mvc-5 entity-framework-6


【解决方案1】:

在我看来,您描述的是正常的一对多关系。您应该将主要实体存储在 1 个表中,将链接实体存储在另一个表中:

id    entityname    entityProperty
1     FirstEntity   Im a property
2     SecondEntity  Me too

id    entityid      comment
1     1             This is a comment
2     1             This is also a comment
3     2             This might be a comment

id    entityid      attachment
1     1             This is an attachment
2     2             This is also an attachment
3     2             This might be an attachment

如果您打算先使用代码,您可能想看看这个: http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

【讨论】:

  • 凯文您好,感谢您的回答,但它对我不起作用。您确实在描述正常的一对多关系。例如,在我的情况下,我的客户实体的主键 (id) 值可能与我的订单实体的主键 (id) 值相同,因此您将检索未链接到的 cmets 和附件适当的实体。
  • 如果您将客户和订单存储在同一个表中,您还应该考虑将它们拆分为单独的表,或者添加一个真实的pk。你的 pk 应该永远是独一无二的。
【解决方案2】:

您将在此处遇到的最大问题是,您需要将 FK 引用返回到表中,以了解此评论的记录。因此,您需要一堆可以为空的属性,这些属性指向可以存储在此处的每个表的相应记录。这不是最好的解决方案,因为每个新表都需要 Comment 表上的新列(但如果您想使用导航属性,这是一个选项)。因此,我认为 EF 导航属性不会起作用,因为您无法使用相同的 2 个 FK 来指向多个表。

我能想到的唯一另一件事就是不那么好。您必须手动构建查询并创建一个未映射到每个父级的 ICollection。然后你必须自己建立评论列表。不过,这并不太难,只是比较烦人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多