DB First模式下如何让EF忽略Azure SQL时态表的隐藏列?
解决EF DB First模式下忽略时态表隐藏列的问题
碰到过一模一样的坑!时态表的ValidFrom和ValidTo这两个隐藏列,确实会在DB First更新模型时自动钻进实体类里,搞崩现有代码。这里有几个靠谱的解决办法,按持久度排序给你列出来:
1. 修改T4模板(一劳永逸)
DB First默认靠T4模板生成实体类,我们直接改模板让它跳过这俩列就行:
- 找到项目里和EDMX同名的
Model.tt文件(就是那个带代码生成逻辑的模板) - 打开后找到遍历实体属性的代码块,大概是这样:
foreach (var property in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)) { - 给筛选条件加个判断,跳过目标列:
foreach (var property in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity && p.Name != "ValidFrom" && p.Name != "ValidTo")) { - 保存模板后,下次更新模型时这两个列就不会出现在实体类里了,彻底解决问题。
2. 更新模型时手动排除列(适合不频繁更新的场景)
如果你的模型不常变动,每次更新时手动操作也很省心:
- 右键EDMX文件,选择Update Model from Database
- 在弹出的窗口里,展开要更新的表,取消勾选
ValidFrom和ValidTo - 完成更新后,模型里就不会包含这两个列了。
3. 用分部类+DataAnnotations/Fluent API忽略列
不想动模板或者手动操作的话,可以给实体建分部类,标记这两个列为未映射:
- 比如你的实体类是
Customer,新建一个分部类:public partial class Customer { [NotMapped] public DateTime ValidFrom { get; set; } [NotMapped] public DateTime ValidTo { get; set; } } - 或者在
DbContext的OnModelCreating里用Fluent API配置:
这个方法的好处是,就算模型更新覆盖了主实体类,分部类的配置也不会丢失。protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Customer>() .Ignore(c => c.ValidFrom) .Ignore(c => c.ValidTo); // 其他实体同理配置 }
内容的提问来源于stack exchange,提问作者RandomlyOnside
相关产品推荐
相关产品推荐

