实体框架,用于读取列但阻止其更新

Gre*_*ick 12 c# entity-framework

给定一个包含历史数据但不再填充的列的数据库表,是否有一种方法可以在Entity Framework中读取该列但是在使用相同的模型对象时阻止它更新?

例如,我有一个对象

public class MyObject
{
    public string CurrentDataColumnName { get; set; }
    public string HistoricDataColumnName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从文档中我不相信我可以做以下任何一种,因为这将阻止EF读取数据并保持它.

(1)HistoricDataColumnName使用以下属性装饰属性

[NotMapped]
Run Code Online (Sandbox Code Playgroud)

(2)将以下内容添加到我的EntityTypeConfigurationforMyObject

Ignore(x => x.HistoricDataColumnName)
Run Code Online (Sandbox Code Playgroud)

Adu*_*cci 8

您可以将列标记为已计算,以防止Entity Framework更新/插入该列.

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string HistoricDataColumnName { get; set; }
Run Code Online (Sandbox Code Playgroud)

DatabaseGenerated

一个重要的数据库功能是具有计算属性的能力.如果要将Code First类映射到包含计算列的表,则不希望Entity Framework尝试更新这些列.但是,您确实希望EF在插入或更新数据后从数据库中返回这些值.您可以使用DatabaseGenerated注释来标记类中的这些属性以及Computed enum.其他枚举是None和Identity.

  • 这样做的最大缺点是EF将读取每个插入和更新列的值.这可能会对性能产生重大影响. (3认同)
  • @GertArnold - 称这是一个非常大的缺点_有点紧张.如果对性能产生明显影响,我会感到惊讶 (3认同)
  • 好吧,有.当然不是只有几个更新,但我遇到过一种情况,我不得不创建一个没有计算列映射的专用上下文来促进更大的插入和更新任务.在这个问题中,它是关于一个未知大小的字符串列,*可能*相当大.至少你可以说是值得关注的.此外,Akbari的第一条评论让我怀疑这是否是正确的方法,但是好的,太糟糕的OP和vaindil都没有回应. (3认同)
  • 但是通过使用`DatabaseGenerated(DatabaseGeneratedOption.Computed)`装饰`HistoricDataColumnName`属性,它将*NULL*插入到`HistoricDataColumnName`中.那么使用`Insert`语句时这是一个很好的选择吗?由于提到的帖子阻止它**更新**而不是**插入**.如果他想从输入中插入`HistoricDataColumnName`的值,该怎么办?无论他填写什么,它都在数据库中存储为NULL. (2认同)