ASP.NET MVC5:如何让Entity Framework忽略模型中的属性?
在Entity Framework Code-First中排除属性映射到数据库列
嗨,针对你的问题,我来给你梳理几种可行的方案,顺便解答你关于private关键字的疑问:
方法1:使用[NotMapped]数据注解特性
这是最直接的方式,只需要给你不想映射的属性加上[NotMapped]特性,EF就会在生成迁移和数据库表时忽略这些属性。修改后的模型代码如下:
using System.ComponentModel.DataAnnotations.Schema; // 需要引入这个命名空间 public class Class { public int Id { get; set; } [Required] public int SkillId { get; set; } public Skill Skill { get; set; } [NotMapped] // 标记该属性不映射到数据库 public string SelectedSkills { get; set; } [NotMapped] // 同上 public int Repeat { get; set; } }
方法2:使用Fluent API配置
如果你更倾向于将实体配置和模型类分离,可以在你的DbContext类的OnModelCreating方法中使用Ignore方法来排除属性:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 忽略SelectedSkills和Repeat属性 modelBuilder.Entity<Class>() .Ignore(c => c.SelectedSkills) .Ignore(c => c.Repeat); }
关于private关键字的疑问
使用private关键字确实能让EF不映射这个属性——因为EF默认只映射**公共(public)**的属性,私有属性不会被自动包含到数据库映射中。但这里有个关键问题:如果你把SelectedSkills和Repeat改成private,那么这些属性只能在Class类的内部被访问和修改,外部的业务逻辑、视图等都无法直接使用它们。
所以如果你的需求是保留属性的公共访问权限,但不映射到数据库,那private关键字就不适用了,还是用上面两种方法更合适。只有当你完全不需要在类外部访问这些属性时,private才是可选方案。
内容的提问来源于stack exchange,提问作者Mr Nobody




