如何在EF Core中通过视图设置底层表的标记字段?
EF Core 操作视图自动设置字段的实现方案
方法一:通过SaveChanges拦截自动赋值
- 先将
VendorModel映射到Vendors视图,确保视图有可识别的主键(复用People表的主键即可):public class VendorModel { public int Id { get; set; } public string Name { get; set; } public bool VendorFlag { get; set; } // 其他人员相关字段 } // 在DbContext的OnModelCreating中配置映射 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<VendorModel>() .ToView("Vendors") .HasKey(v => v.Id); } - 重写DbContext的
SaveChanges系列方法,在保存前自动给新增/修改的供应商设置VendorFlag:
每次通过public override int SaveChanges(bool acceptAllChangesOnSuccess) { AutoSetVendorFlag(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { AutoSetVendorFlag(); return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } private void AutoSetVendorFlag() { var vendorEntries = ChangeTracker.Entries<VendorModel>() .Where(e => e.State is EntityState.Added or EntityState.Modified); foreach (var entry in vendorEntries) { entry.Entity.VendorFlag = true; } }VendorModel添加或更新供应商时,EF会自动把VendorFlag设为true再提交到视图。
方法二:实体构造函数默认赋值
如果只需要在新增供应商时设置标记,可以直接在VendorModel的构造函数里初始化字段:
public class VendorModel { public VendorModel() { VendorFlag = true; } public int Id { get; set; } public string Name { get; set; } public bool VendorFlag { get; set; } // 其他字段 }
这种方式简单直接,但如果存在更新场景需要强制保留标记,还是结合SaveChanges拦截更稳妥。
方法三:视图触发器+EF实体操作
先在数据库端给Vendors视图创建INSTEAD OF INSERT触发器,确保插入视图时自动给People表的VendorFlag赋值:
CREATE TRIGGER trg_Vendors_Insert ON Vendors INSTEAD OF INSERT AS BEGIN INSERT INTO People (Name, VendorFlag, /* 其他对应字段 */) SELECT Name, 1, /* 匹配的字段列表 */ FROM inserted; END
之后EF端正常操作VendorModel即可,数据库触发器会自动处理VendorFlag的设置,把字段逻辑放在数据库层,EF只负责实体的CRUD。
内容的提问来源于stack exchange,提问作者BWhite
相关产品推荐
相关产品推荐

