Entity Framework中保留checked属性并消除无效列名错误的方法
解决Entity Framework中添加非数据库列属性的报错问题
这个问题我之前帮不少开发者踩过坑,其实EF早就为这种“只在内存里用、不需要映射到数据库”的属性准备了解决方案,给你两种简单的方法:
方法一:用[NotMapped]特性标记属性
这是最直接的方式,只需要在你的checked属性上方添加[NotMapped]特性,告诉EF“这个属性不用管数据库,我自己在内存里用”。修改后的代码如下:
namespace Entities { [MetadataType(typeof(FloorsMetadata))] public partial class Floors { // 添加NotMapped特性,EF就不会尝试映射这个列了 [System.ComponentModel.DataAnnotations.Schema.NotMapped] public bool checked { get; set; } public static List<Floors> GetFloors(context db) { return db.Floors.ToList(); } } // 你的FloorsMetadata类代码... }
注意:这个特性来自System.ComponentModel.DataAnnotations.Schema命名空间,如果你的代码里没引用这个命名空间,要么加using语句,要么就像上面那样写全限定名。
方法二:用Fluent API配置忽略属性
如果你不习惯用特性,也可以在DbContext的配置里告诉EF忽略这个属性。找到你的DbContext类,重写OnModelCreating方法,添加忽略配置:
public class YourDbContext : DbContext { // 你的DbSet和构造函数... protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 让EF忽略Floors实体的checked属性 modelBuilder.Entity<Floors>().Ignore(f => f.checked); // 其他实体的配置... } }
小提醒
这个checked属性是内存属性,只能在数据从数据库加载到内存之后(比如调用ToList()之后)用来做筛选逻辑,不能直接写在Linq to Entities的查询里(比如db.Floors.Where(f => f.checked)会报错,因为数据库根本没有这个列),这点要注意哦!
内容的提问来源于stack exchange,提问作者Dev Db
相关产品推荐
相关产品推荐

