Entity framework EF4 Code First:设置关联时在模型中包括或不包括外键

Entity framework EF4 Code First:设置关联时在模型中包括或不包括外键,entity-framework,reference,entity-framework-4,poco,code-first,Entity Framework,Reference,Entity Framework 4,Poco,Code First,在一些代码优先的EF4演练中,您在定义POCO时会看到如下模式: public class Product { public int ID { get; set; } public int ManufacturerId { get; set; } public virtual Manufacturer Manufacturer { get; set; } } 为什么产品既有制造商ID又有制造商参考?这与延迟加载有关吗?它实际上回到了实体框架的故事:在EF1中,我们只有

在一些代码优先的EF4演练中,您在定义POCO时会看到如下模式:

public class Product
{
    public int ID { get; set; }

    public int ManufacturerId { get; set; }
    public virtual Manufacturer Manufacturer { get; set; }
}

为什么产品既有制造商ID又有制造商参考?这与延迟加载有关吗?

它实际上回到了实体框架的故事:在EF1中,我们只有独立的关联,这意味着FKs(例如ManufacturerId)没有暴露在依赖对象(例如Product)上,而您只使用导航属性(例如Manufacturer)。 在EF4中引入了一种新的关联类型:外键关联,其中FKs出现在模型中,您可以直接使用它们

因此,以下仍然是一个完全有效的模型,但它是一种EF1风格(即独立关联):

也就是说,建议始终在对象中包含外键,因为它为您使用对象模型提供了最大的灵活性:

public class Product {
    public int ID { get; set; }
    public int ManufacturerId { get; set; }
    public virtual Manufacturer Manufacturer { get; set; }
}
有趣的是,EF code首先将
ManufacturerId
识别为
Manufacturer
导航属性的FK,并将基于数据库中的FK创建关系


顺便说一句,这与延迟加载没有任何关系,只要您像在模型中那样将导航属性标记为vitual,无论是否使用FKs,延迟加载都可以工作。

Wow。我不知道代码优先公约会承认这一点。非常感谢。没问题,是的,基于这些约定,它神奇地做到了:
public class Product {
    public int ID { get; set; }
    public int ManufacturerId { get; set; }
    public virtual Manufacturer Manufacturer { get; set; }
}