.net - EF4 代码优先 : defining object relationships, 外键

标签 .net entity-framework mapping entity-relationship code-first

< RANT_MODE >
EF 代码优先方法旨在节省大量时间,但目前我只看到玩具示例并花了数小时试图了解如何让它生成我想要的数据库。但仍然希望 Eureka 时刻:-)
< RANT_MODE/>
关于问题!
虚拟与具体属性
我试图了解 EF 如何映射和检索对象关系。何时应将属性标记为 virtual什么时候不? (如 public Person Owner { get; set; }public virtual Person Owner { get; set; } 。)在代码优先的数十个示例中,我看到他们似乎可以互换使用这些示例,但没有太多解释。我所知道的是导航属性( public virtual ICollection<Person> Owners { get; set; } )需要是 virtual为了使延迟加载成为可能(正确..?),但这在非收藏品世界中如何应用?
对象关系和外键
除了我感兴趣的“主要”属性(public int OwnerId { get; set; })之外,我找不到任何关于是否应该包含外键字段(public Person Owner { get; set; })的信息。我试着不这样做,EF 友好地自动添加了一个名为 Owner_Id 的 int 列在我的 table 上,似乎理解我想要实现的目标。
Conventions for Code First (“外键”部分)EF 团队提到“在关系的依赖端包含外键属性是很常见的”,并且“Code First 现在将推断出任何名为“”的属性(即 OwnerId)[ ...]具有与主键相同的数据类型,表示关系的外键”。 IE。如果我有两个 EF 就会知道它们是相关的。
但是,除了“外来对象”本身之外,明确指定持有 FK 的此类属性是否被认为是一种好的做法?
外来对象、外键 - 续
正如我上面提到的,即使我只有 public Person Owner { get; set; }在我的对象(比如 Event )中,表格 Events将以 Owner_Id 为特色由 EF 自动添加的列。更重要的是,检索后我将可以访问 Owner 的属性。 .
但是,请考虑以下情况。我有两个类(class):

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属性(property)?
指针,指针
如果您能澄清上述内容,我将不胜感激 - 达到了真正希望知道答案的地步,但无法阅读另一篇文章,该文章只是展示了另一个玩具示例,说明使用 EF 是多么容易。也就是说,如果您确实对 EF 的大脑有深入的最新引用,请也发布链接。
提前感谢您的宝贵时间!

最佳答案

虚拟与最终属性:

这实际上与代码无关,这是 EF 和 POCO 的主题:当您拥有 POCO 时,您会失去对导航属性的大量 EF 支持,您可以通过将它们设为虚拟来选择加入它们。这允许 EF 在运行时创建代理,并通过覆盖该代理类中的导航属性为您提供支持。这些支持是更改通知、关系修复和延迟加载。

延迟加载对 Collection 和非 Collection 类型的导航属性的工作方式相同。此外,始终将导航属性标记为虚拟也是一种很好的做法。

外键关联或独立关联

EF3.5 不支持关联中的 FK 并将其隐藏(也称为独立关联)。 EF4 开始支持关联中的 FK(也称为外键关联)。取决于您喜欢哪一个,您可以显式包含或不包含 FK 属性,但除了导航属性之外,显式指定 FK 属性绝对是一种好习惯,因为它为您提供了使用对象的最大灵 active 。

Upon retrieval, myAccountInstanceFromDb.Owner is null. Why is that? How do I tell EF that it should do its magic and populate my Owner property?



当然,您没有将其标记为虚拟,因此不支持延迟加载,但您也没有明确地预先加载或延迟加载它。要解决此问题,请使用 virtual 关键字并让 EF 为您延迟加载它,或者使用 Include 方法在整个对象物化时预先加载它。

标量属性与导航属性

标量属性是其值包含在实体中并与表列相对应的属性(例如 Account.Id)。

导航属性只是指向相关实体的指针。例如,Account 实体有一个 Owner 属性,该属性将使应用程序能够从一个 Account 导航到拥有该 Account 的 Owner。

所以,回到您的问题,您需要做的就是将导航属性指定为 virtual Person Owner并可选择将 FK 属性指定为 int OwnerId你很高兴。

关于.net - EF4 代码优先 : defining object relationships, 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4281987/

相关文章:

xml - hibernate 一对多列表映射错误

.net - Finalize() 期间的异常 : what methodology are you using to detect garbage collector-time exceptions?

c# - SetSystemTime - UTC 或本地时间?

asp.net-mvc-3 - Entity Framework 将 float 数据类型映射为 double

python - 如何使用 Python 以可迭代的方式映射 JSON 值

mapping - 使用 Entity Framework 4.1 Codefirst,如何在 poco 类中创建未映射的字段?

.net - 当表中的数据发生变化时,SqlCacheDependency 如何知道何时与任何监听器通信?

c# - 我只在 Windows 7 上得到 NullReference 异常的任何原因?

c# - 防止 Entity Framework 5 查询 Information_Schema_Tables

c# - 如何在 linq 中编写 EF 以包含小写比较