EF Core 3.1中SQL视图ItemView能否定义与Job的一对多关联关系
问题解答
完全可以实现你要的效果,EF Core 3.1支持为数据库视图配置和普通表实体完全一致的关联关系,具体操作步骤如下:
1. 定义ItemView实体类
保留原Item的所有属性,加上你视图的新增字段,同时保留和Item一致的Jobs导航属性:
public class ItemView { // 原Item实体的基础属性 public Guid Id { get; set; } // 以下为ItemView视图新增的自定义属性 // 请根据你实际的视图字段补充 public string ExtraProp1 { get; set; } public int ExtraProp2 { get; set; } // 和Item完全一致的Jobs关联导航属性 public virtual ICollection<Job> Jobs { get; set; } }
2. 在DbContext中注册集合
public DbSet<ItemView> ItemView { get; set; }
3. 在OnModelCreating中配置实体关系
需要手动指定视图的主键,标记实体对应数据库视图,同时配置和Job的一对多关联:
modelBuilder.Entity<ItemView>(entity => { // 手动指定Id作为主键,EF默认会将视图识别为无键实体,不指定主键无法使用关联查询 entity.HasKey(e => e.Id); // 告诉EF该实体对应数据库中的ItemView视图,而非表 entity.ToView("ItemView"); // 配置和Job的一对多关系,规则和Item与Job的关联完全一致 entity.HasMany(e => e.Jobs) // 因为Job实体没有指向ItemView的导航属性,此处WithOne不传参即可 .WithOne() .HasForeignKey(job => job.ItemId) // 视图为只读,禁用级联删除避免误操作 .OnDelete(DeleteBehavior.Restrict); });
配置完成后你写的查询语句就可以直接运行:
var result = await context.ItemView.Include(i => i.Jobs)
返回的对象结构和Item.Include(i => i.Jobs)完全一致,仅ItemView对象多了你自定义的视图新增属性。
注意事项
ItemView作为只读视图,不要对其执行增删改操作,EF不会生成对应的有效SQL,强行操作会抛出异常- 不需要修改现有
Job实体的定义,无需额外添加指向ItemView的导航属性
内容的提问来源于stack exchange,提问作者Markus S.
相关产品推荐
相关产品推荐

