【发布时间】:2011-05-15 23:35:42
【问题描述】:
EF 代码优先方法旨在节省大量时间,但目前我只看到玩具示例并花费数小时试图了解如何使其生成我想要的数据库。但仍然希望那个尤里卡时刻:-)
关于问题!
虚拟与具体属性
我试图了解 EF 如何映射和检索对象关系。什么时候应该将属性标记为virtual,什么时候不应该? (如public Person Owner { get; set; } vs. public virtual Person Owner { get; set; }。)在代码优先的几十个例子中,我看到他们似乎可以互换使用这些,没有太多解释。我所知道的是,导航属性 (public virtual ICollection<Person> Owners { get; set; }) 需要为 virtual 才能使延迟加载成为可能(正确..?),但这在非收藏品世界中如何应用?
对象关系和外键
除了我感兴趣的“主要”属性 (public Person Owner { get; set; }) 之外,我找不到任何关于是否应该包含外键字段 (public int OwnerId { get; set; }) 的信息。我试着不这样做,EF 好心地在我的表中自动添加了一个名为 Owner_Id 的 int 列,似乎理解了我想要实现的目标。
在Conventions for Code First(“外键”部分)中,EF 团队提到“通常在关系的依赖端包含外键属性”,并且“Code First 现在将推断任何名为''(即 OwnerId)[...] 具有与主键相同的数据类型,表示关系的外键”。 IE。如果我有两个 EF 就会知道它们是相关的。
但是,除了“外来对象”本身之外,明确指定持有 FK 的此类属性是否被认为是一种好的做法?
外来对象、外键 - 续
正如我上面提到的,即使我的对象中只有public Person Owner { get; set; }(比如Event),表Events 也会包含一个由EF 自动添加的Owner_Id 列。更重要的是,检索后我将可以访问Owner 的属性。
但是,请考虑以下情况。我有两个课程:
public class Account
{
public int Id { get; set; }
public Person Owner { get; set; }
}
public class OpenIdAccount : Account
{
public string Identifier { get; set; }
}
我希望它们与 TPT 相关。这意味着手动映射:
modelBuilder.Entity<Account>().MapHierarchy(a => new
{
a.Id,
Owner_Id = a.Owner.Id
}).ToTable("Account");
modelBuilder.Entity<OpenIdAccount>().MapHierarchy(a => new
{
a.Id,
a.Identifier
}).ToTable("OpenIdAccount");
您可能会注意到,我尝试重新创建 EF 对我的 Owner_Id 列所做的事情。然而在检索时,myAccountInstanceFromDb.Owner 为空。这是为什么?我如何告诉 EF 它应该发挥作用并填充我的 Owner 属性?
指针、指针
如果您能澄清上述内容,我将不胜感激 - 已经到了非常想知道答案的地步,但无法阅读另一篇文章,该文章只是展示了另一个玩具示例,说明使用 EF 是多么容易.也就是说,如果您确实对 EF 的大脑有深入的最新参考,请也发布链接。
提前感谢您的宝贵时间!
【问题讨论】:
-
代码优先旨在为您节省时间,如果您不太关心数据库的话。如果您想要精细控制,那么最好的方法是在 SQL Management Studio 中创建它并首先使用数据库来生成您的 EDMX。
-
猜这取决于一个人对什么是“分钟控制”的看法 :-) 就我个人而言,我不关心列顺序和列名,但我确实想要一个高效且工程设计良好的数据库观点......如果我将来与我合作,我不会害怕。需要直接查询。但您的观点绝对正确,我同意 - CF 为我们提供了强大的工具,但也带走了一些控制权。
-
我希望我能多次对此投票,尤其是咆哮。如果实际上约定没有以任何可参考的方式发布,我不确定如何按照约定操作代码。我在这里有一个小小的约定技巧,还有另一个。非常痛苦。
-
感谢 Ralph,我不得不说感谢 SO 的一些乐于助人的人,我认为我经历了最糟糕的情况,并开始真正享受 EF4。在某个地方完整解释约定的观点仍然有效,我现在所知道的大部分内容都是来自 ScottGu 的各种帖子和其他博客的片段,这些片段通过反复试验痛苦地汇集在一起。希望进入 RTM 后情况会有所改善!
-
喜欢这篇文章。我同意你们所有人的看法,我这周刚开始使用 EF4 + SQL CE4 并看到你在这里描述的每一个痛苦的步骤,没有一个帖子可以为你提供广泛的图片,只有很多类似的玩具样本。
标签: .net entity-framework mapping entity-relationship code-first