实体框架 - 子对象中的外键

时间:2012-10-14 18:42:37

标签: c# entity-framework fluent-interface

我正在使用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对象本身?

1 个答案:

答案 0 :(得分: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协会差很多,虽然看起来这仅限于View Generation,所以这是一次性启动成本(每次启动应用或应用时)域)。此外,对于小型号,您可能不会注意到它。:

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

编辑:

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

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