2012-10-14 29 views
0

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

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

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

我想这样做,但是,是能够做同样的事情但不必将AuthorId属性直接包含在模型中。原因是,因为作者对象已经包含相应的ID,所以我重复两次相同的信息。我想沿着这些线路做一些事情:

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

那么,有没有什么办法不检索作者子对象,而无需冗余存储的AuthorID在博客帖子对象旁边的作者对象本身?

回答

1

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

你可以阅读更多关于他们在这里:

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

你仍然可以做的事情老办法,用简单的导航性能。但是你需要稍微不同的语法。有一件事是独立协会要求你在两端都有导航属性,并且你说你只需要单向导航。所以你坚持要么添加一个关联到你的作者实体,要么使用FK关联。

你也可以发现本文由我们自己的拉吉斯拉夫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")); 
+1

只有一个导航属性的独立关联正常工作。你可以使用'HasRequired(t => t.Author).WithMany()'作为默认的FK(带有下划线,'Author_Id'的东西)或追加'.Map(m => m.MapKey(“AuthorId” ))'用于映射FK名称的显式。 – Slauma

+0

@Slauma - 嗯..有趣的知道。我读过的所有内容都说独立关联需要两端的导航属性。 –