【问题标题】:Entity Framework - Foreign key in sub-object实体框架 - 子对象中的外键
【发布时间】:2012-10-14 18:42:36
【问题描述】:

我正在使用 Entity Framework 从数据库中检索博客数据。我有一个类“BlogPost”和一个类“作者”。一位作者可能有许多博客文章,但作者对象本身并不包含它们的列表。就 Author 对象而言,它独立于所有博客文章。

Author 类的一个实例作为属性包含在 BlogPost 中。每个作者都有一个 AuthorId。我想从我的数据库中提取一个给定的博客,并让 Author 对象填充相关数据。我已经设法通过在我的 BlogPost 类中包含 AuthorId 属性来做到这一点,使用以下代码映射对象:

this.HasRequired(t => t.Author).WithMany().HasForeignKey(x => x.AuthorId);

然而,我想做的是能够做同样的事情,但不必将 AuthorId 属性直接包含在模型中。原因是,由于 Author 对象已经包含相应的 ID,因此我将同一条信息重复两次。我想按照这些思路做一些事情:

this.Property(t => t.Author.Id).HasColumnName("id_user");
this.HasRequired<TwitterUser>(t => t.Author).WithMany().HasForeignKey(t => t.Author.Id);

那么,有没有什么方法可以检索 Author 子对象,而不必将 AuthorID 冗余存储在 BlogPost 对象中以及 Author 对象本身?

【问题讨论】:

    标签: c# entity-framework fluent-interface


    【解决方案1】:

    您使用的语法称为“外键关联”,它是在 EF 4 中引入的,因为它解决了许多问题。例如,当使用 FK 关联时,您可以自动执行级联删除。

    您可以在此处阅读有关它们的更多信息:

    http://blogs.msdn.com/b/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx

    您仍然可以使用简单的导航属性以旧方式进行操作。但是您将需要稍微不同的语法。一件事是独立关联要求您在两端都有导航属性,并且您说您只想要这种单向。因此,您要么向作者实体添加关联,要么使用 FK 关联。

    您可能还会发现我们自己的 Ladislav Mrnka 的这篇文章很有用:

    http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/

    另外请注意,根据 EF 团队的说法,独立关联的性能可能比 FK 关联差得多,尽管这似乎仅限于视图生成,因此这是一次性启动成本(每次启动应用程序或应用程序时)领域)。此外,对于小型模型,您可能不会注意到它。:

    http://msdn.microsoft.com/en-us/data/hh949853.aspx

    编辑:

    正如@Slauma 所指出的,您可以使用 .Map 属性来映射独立关联,如下所示:

    this.HasRequired(t => t.Author).WithMany().Map(m => m.MapKey("AuthorId"));
    

    【讨论】:

    • 只有一个导航属性的独立关联可以正常工作。您可以使用 HasRequired(t =&gt; t.Author).WithMany() 作为默认 FK(带有下划线的东西,Author_Id 左右)或附加 .Map(m =&gt; m.MapKey("AuthorId")) 以明确映射 FK 名称。
    • @Slauma - 嗯.. 很有趣。我读过的所有内容都说独立关联需要两端的导航属性。
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多