为何无键实体(Keyless entity)会在数据库中被创建?
问题解答
这种情况不正常,无键实体(Keyless Entity)的设计初衷是映射查询结果(比如视图、存储过程返回值、临时结果集),默认不会被EF Core生成对应的数据库表。你的配置里的额外设置触发了表的创建。
原因分析
你在无键实体的配置中添加了这些会迫使EF Core生成表的配置项:
- 定义了唯一索引
IX_DataRoomFiles - 配置了外键约束(
FK_DataRoomFiles_DataRoomFolders、FK_DataRoomFiles_Documents) - 给
DataRoomFolderId设置了ValueGeneratedOnAdd()
这些配置都需要对应的数据库对象来支撑,EF Core因此自动生成了物理表。
解决方法
如果DataRoomFile确实是仅用于查询的无键实体,需要调整配置:
- 移除索引、外键约束的配置
- 删除
ValueGeneratedOnAdd()设置(无键实体不需要自动生成值)
修改后的配置示例:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<DataRoomFile>(entity => { entity.HasNoKey(); entity.Property(e => e.DataRoomFolderId) .HasColumnName("DataRoomFolderID"); entity.Property(e => e.DocumentId).HasColumnName("DocumentID"); }); }
补充说明
如果你的需求是创建多对多关系的中间关联表,那应该使用有键实体,或者让EF Core自动生成多对多关系,而非用无键实体来实现。无键实体仅适用于不需要持久化到数据库的查询结果映射场景。
内容的提问来源于stack exchange,提问作者Nishant Sharma
相关产品推荐
相关产品推荐

