EF迁移生成多余列:ServiceModel表自动生成未定义的EmployeeModelId列
问题原因
这是Entity Framework的默认约定行为:当EF检测到EmployeeModel类中存在List<ServiceModel>类型的导航属性AvailableServices时,会默认判定两者为一对多关系,自动在多端(ServiceModel对应的表)生成外键列EmployeeModelId。
你可以根据自己的业务场景选择以下两种解决方案,两种方案都不需要修改AvailableServices的List<ServiceModel>类型定义:
场景1:AvailableServices仅为代码层面使用的属性,不需要和数据库做映射
直接在该属性上添加[NotMapped]特性即可,EF在生成迁移时会完全忽略这个属性,不会生成任何额外的外键列:
using System.ComponentModel.DataAnnotations.Schema; public class EmployeeModel { public int Id { get; set; } public int UserID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [NotMapped] public List<ServiceModel> AvailableServices { get; set; } public DateTime ShiftStart { get; set; } public DateTime ShiftEnd { get; set; } }
注意:该方案下EF不会自动维护AvailableServices的赋值,你需要根据业务逻辑手动为该属性填充数据。
场景2:需要保留员工和服务的关联关系,只是不想外键出现在ServiceModel表中
你可以配置两者为多对多关系,EF会生成独立的中间表存储关联关系,不会改动ServiceModel的表结构。
只需要在你的DbContext类中重写OnModelCreating方法,添加如下配置即可:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<EmployeeModel>() .HasMany(e => e.AvailableServices) .WithMany() // 不需要在ServiceModel中定义反向导航属性 .Map(m => { m.ToTable("EmployeeAvailableServices"); // 可自定义中间表的表名 m.MapLeftKey("EmployeeModelId"); m.MapRightKey("ServiceModelId"); }); }
配置完成后重新生成迁移,ServiceModel表结构就会和你定义的完全一致,新增的中间表会用来存储员工和服务的关联。你可以正常通过Include(e => e.AvailableServices)来加载员工关联的服务列表,EF会自动处理中间表的查询和写入。
内容的提问来源于stack exchange,提问作者PetoMPP
相关产品推荐
相关产品推荐

