EF6 Code First中如何在类中访问现有外键及是否需迁移
在EF6 Code First中访问现有外键及迁移问题解答
嘿,我来帮你搞定这个EF6的问题!咱们一步步来:
1. 如何在SqlConferenceType类中添加外键属性以访问SqlLayerTypeSet_SqlLayerTypeSetID
因为你这个外键的名字不是EF默认约定的格式(默认通常是关联实体名+Id,比如SqlLayerTypeSetId),所以需要显式配置才能让实体类和数据库里的现有外键关联起来,有两种常用方式:
方式一:使用DataAnnotations特性
直接在SqlConferenceType类里添加外键属性和对应的导航属性,并用[ForeignKey]特性关联它们:
// 对应数据库里的外键列SqlLayerTypeSet_SqlLayerTypeSetID public int SqlLayerTypeSet_SqlLayerTypeSetID { get; set; } // 导航属性,通过ForeignKey特性指定使用上面的外键属性 [ForeignKey("SqlLayerTypeSet_SqlLayerTypeSetID")] public virtual SqlLayerTypeSet SqlLayerTypeSet { get; set; }
如果你的SqlConferenceType类已经有了SqlLayerTypeSet导航属性,那只需要给这个导航属性加上[ForeignKey]特性,指向新增的外键属性就行。
方式二:使用Fluent API配置
如果更倾向于在DbContext里统一配置模型关系,可以在你的DbContext重写的OnModelCreating方法里添加这段代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<SqlConferenceType>() // 根据实际关系类型选择HasRequired/HasOptional .HasRequired(c => c.SqlLayerTypeSet) // 如果是一对多关系,这里可以指定SqlLayerTypeSet里对应的集合导航属性,比如.WithMany(l => l.SqlConferenceTypes) .WithMany() // 指定外键属性对应数据库里的列 .HasForeignKey(c => c.SqlLayerTypeSet_SqlLayerTypeSetID); }
2. 添加后是否需要新建迁移?
答案是需要。
你之前觉得EF可以通过约定直接访问,其实是误解了约定的作用:EF的约定是当你定义了导航属性但没显式外键属性时,它会自动在数据库生成外键列,但这时候你的实体类里并没有对应的外键属性。现在你把这个外键属性显式添加到实体类中,属于模型结构的变更——EF的模型元数据里多了一个属性,需要和数据库里的现有列建立映射关系。
新建迁移的作用是更新EF的模型快照,让它和当前的实体模型匹配,虽然这次迁移不会修改数据库的结构(因为外键列已经存在),但必须执行迁移来确保EF的模型和数据库的映射关系是正确的,否则后续可能出现模型验证错误或者数据操作异常。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

