You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为代表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:04:32