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如果我想要达到一对多关系的"父母",那么这不是一个简单的参考吗?
是的,您不需要将 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)