EF 7如何用Fluent API配置带固定条件的ItemEntity导航属性?
在EF7中配置带条件的多导航属性
这完全可行,无需简化数据库模型,通过EF7的Fluent API可以直接配置这类带筛选条件的关联导航属性,具体步骤如下:
1. 更新实体类,添加导航属性
先在ItemEntity中补充需要的两个导航属性:
public class ItemEntity { public string Id { get; set; } public string CategoryId1 { get; set; } public string CategoryId2 { get; set; } // 新增导航属性 public ICollection<CategoryLinesEntity> Category1Lines { get; set; } = new List<CategoryLinesEntity>(); public ICollection<CategoryLinesEntity> Category2Lines { get; set; } = new List<CategoryLinesEntity>(); } public class CategoryLinesEntity { public string CategoryId { get; set; } public string Type { get; set; } }
2. 使用Fluent API配置关联与筛选
在你的DbContext重写OnModelCreating方法,配置两个导航属性的关联规则和筛选条件:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Category1Lines:关联CategoryId1,且Type为1的CategoryLinesEntity记录 modelBuilder.Entity<ItemEntity>() .HasMany(item => item.Category1Lines) .WithOne() // 若无需反向导航,保持为空即可;如需反向导航,可指定对应属性,比如WithOne(line => line.Item1) .HasForeignKey(line => line.CategoryId) .HasPrincipalKey(item => item.CategoryId1) .HasFilter("Type = '1'"); // 添加Type筛选条件 // 配置Category2Lines:关联CategoryId2,且Type为2的CategoryLinesEntity记录 modelBuilder.Entity<ItemEntity>() .HasMany(item => item.Category2Lines) .WithOne() .HasForeignKey(line => line.CategoryId) .HasPrincipalKey(item => item.CategoryId2) .HasFilter("Type = '2'"); }
关键配置说明
HasPrincipalKey:指定主实体(ItemEntity)用于关联的键,这里不是默认的Id,而是CategoryId1和CategoryId2HasFilter:添加SQL级别的筛选条件,确保导航属性只加载符合Type要求的记录- 若需要在
CategoryLinesEntity中添加反向导航属性,只需在实体类中补充public ItemEntity Item1 { get; set; }和public ItemEntity Item2 { get; set; },并在WithOne()中指定对应的属性即可
内容的提问来源于stack exchange,提问作者Zelloxy
相关产品推荐
相关产品推荐

