Entity Framework Code First未生成全部列的问题求助
Entity Framework Code First未生成全部列的问题求助
嘿,我最近用Entity Framework Code First的时候碰到个小问题,想请教下大家:我给Libro实体定义了三个属性,但生成的迁移文件里只创建了id和Titulo两列,导航属性Comments对应的列完全没出现在表结构里,这是咋回事呀?
我的实体类代码:
public class Libro { public int id { get; set; } [Required] public string Titulo { get; set; } public List<Comment> Comments { get; set; } }
生成的迁移文件片段:
migrationBuilder.CreateTable( name: "Libros", columns: table => new { id = table.Column<int>(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), Titulo = table.Column<string>(type: "nvarchar(max)", nullable: false) }, constraints: table => { table.PrimaryKey("PK_Libros", x => x.id); });
后来我捋了下EF的规则才搞明白:这里的Comments是集合类型的导航属性,代表Libro和Comment之间的一对多关系——一个书籍可以对应多条评论。EF Code First的默认逻辑是,不会在"一"的一方(也就是Libros表)添加对应列,而是会在"多"的一方(Comments表)生成一个外键列(比如LibroId),用来关联到Libros表的主键id。
要让这个关系正常生效,得做这几步:
- 正确定义
Comment实体,要包含指向Libro的外键和对应导航属性:
public class Comment { public int Id { get; set; } public string Content { get; set; } // 评论内容,可根据你的需求调整 // 关联Libro的外键字段 public int LibroId { get; set; } // 指向Libro的导航属性 public Libro Libro { get; set; } }
- 在DbContext中添加
Comments的DbSet:
public class YourDbContext : DbContext { public DbSet<Libro> Libros { get; set; } public DbSet<Comment> Comments { get; set; } // 一定要加上这个 }
- 重新生成迁移并更新数据库:
如果之前的迁移还没应用到数据库,可以先删除它,然后运行以下命令重新生成:
Add-Migration AddCommentRelationship Update-Database
这时候EF会自动创建Comments表,并且包含LibroId外键,和Libros表建立关联。要是需要更个性化的配置,还能用Fluent API在DbContext的OnModelCreating方法里手动定义关系:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Libro>() .HasMany(l => l.Comments) // 一个Libro对应多个Comment .WithOne(c => c.Libro) // 每个Comment属于一个Libro .HasForeignKey(c => c.LibroId) // 外键为Comment的LibroId .OnDelete(DeleteBehavior.Cascade); // 可选:设置删除书籍时自动删除关联评论 }
备注:内容来源于stack exchange,提问作者Bayes-T
相关产品推荐
相关产品推荐

