为什么在Entity Framework中的类中有外键?

ane*_*a20 5 c# asp.net-mvc entity-framework ef-code-first

假设我有2个课程:Ninjahas-many NinjaEquipment.在里面NinjaEquipment,我有:public Ninja Ninja { get; set; }.我见过有些人还包括对外键的引用,例如:public int NinjaID { get; set; }.这样做有什么意义?Ninja如果我想要达到一对多关系的"父母",那么这不是一个简单的参考吗?

Luk*_*uke 1

是的,您不需要将 ID 列添加为模型中的属性,实体框架足够智能,可以在大多数情况下为您以及表之间的关系生成外键列。

就我个人而言,当我设置网站时,我有一个想要与实体框架一起使用的现有数据库,因此我需要控件。我自己添加了外键属性,并使用 Fluent API 设置两个表之间的映射,因为我的外键列的名称与实体框架约定不匹配。

例如:

public class NinjaEquipmentMap : EntityTypeConfiguration<NinjaEquipment>
{
    public NinjaEquipmentMap
    {
        // Fluent API examples:

        // Describes the relationship between the entities 
        // and the property to use as the foreign key.
        this.HasRequired(t => t.Ninja)
            .WithMany(c => c.NinjaEquipment)
            .HasForeignKey(c => c.NinjaId);

        // I can specify a relationship using a property name
        // that existed in my existing database.
        this.HasRequired(t => t.Ninja)
            .WithMany(c => c.NinjaEquipment)
            .HasForeignKey(c => c.SuperNinjaId);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您从头开始创建新数据库,则允许实体框架为您完成跑腿工作并生成列可能是可以接受的。

我能想到的另一个原因是您可能想公开模型中的外键值。

// 
// BEFORE
// 
var ninjaEquipment = dbContext.Set<NinjaEquipment>().Find(1);

// We have to load the Ninja record to find out the related Ninja ID
var ninjaId = ninjaEquipment.Ninja.Id;

// 
// AFTER
// 
var ninjaEquipment = dbContext.Set<NinjaEquipment>().Find(1);

// Find out the Ninja equipment ID without having to load the Ninja
var ninjaId = ninjaEquipment.NinjaId;
Run Code Online (Sandbox Code Playgroud)

我个人喜欢这个控制:o)