如何为代表SQL Server对象的C#类添加非持久化属性
解决方法:使用
[NotMapped]数据注解 当然有合适的数据注解可以实现你的需求!你只需要给IsSelected属性添加[NotMapped]注解,这个注解会告诉Entity Framework 不要将该属性映射到数据库表中的任何列,完全符合你只在UI交互中使用它、不持久化到SQL Server的场景。
修改后的Note类代码
public class Note { [Key] [HiddenInput(DisplayValue = false)] public int Id { get; set; } [Display(Name = "Last Edited")] [HiddenInput(DisplayValue = true)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] public DateTime LastEditDateUTC { get; set; } [StringLength(300)] [DisplayFormat(ConvertEmptyStringToNull = false)] [Required(AllowEmptyStrings = true)] public String Subject { get; set; } [StringLength(1000)] [DataType(DataType.MultilineText)] [DisplayFormat(ConvertEmptyStringToNull = false)] [Required(AllowEmptyStrings = true)] public String Text { get; set; } // 仅用于UI交互,不会被EF映射到数据库 [NotMapped] public bool IsSelected { get; set; } }
关于使用场景的可行性
这个场景完全可行!IsSelected这类仅用于UI状态(比如列表勾选、临时标记)的属性,本来就不需要持久化到数据库。添加[NotMapped]后,当你调用mySQLServer.SaveChanges()时,Entity Framework会自动忽略这个属性,不会尝试向SQL Server表中写入它的值,也不会因为数据库表中没有对应的列而抛出异常。
另外补充一下,如果你更倾向于用Fluent API而非数据注解来配置实体,也可以在你的DbContext的OnModelCreating方法中添加如下代码达到同样效果:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Note>().Ignore(n => n.IsSelected); }
不过数据注解的方式更直接,适合这种单个属性的简单配置。
内容的提问来源于stack exchange,提问作者aBlaze
相关产品推荐
相关产品推荐

