【问题标题】:how to tell Entity Framework to ignore database generates values for insert or update?如何告诉实体框架忽略数据库为插入或更新生成的值?
【发布时间】:2018-02-06 08:21:49
【问题描述】:

我是Entity Framework C# 的新手。

我的表table1(示例)中有一个计算列。我将根据其他列值计算计算列值。我不希望Entity Framework 在执行插入/更新操作时包含计算列。我怎样才能使EF 避免该特定列。但我想手动设置该特定列的值。

我搜索了相同的内容,但我无法获得我的问题的答案。请帮助我并提前致谢。

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

你可以使用NotMapped注解

代码优先约定规定,每个属性都属于 支持的数据类型在数据库中表示。那个属性可以 动态创建,不需要存储。你可以标记 任何不使用 NotMapped 映射到数据库的属性 注释。

[NotMapped]
public string Something
{
    get
    {
        return _something;
    }
    set
    {
        _something = value
    }
}

更新:这不会映射到 dB,因此可能不是您要查找的内容


只是为了让DatabaseGenerated 注释更完整,是您正在寻找的机器人

一个重要的数据库功能是计算能力 特性。如果您将 Code First 类映射到 包含计算列,您不希望实体框架尝试 更新这些列。但是您确实希望 EF 从 插入或更新数据后的数据库。您可以使用 DatabaseGenerated 注释以标记您的类中的这些属性 连同计算的枚举。其他枚举是 None 和 Identity。

可以与DatabaseGeneratedOption一起使用

  • 计算:数据库在插入或更新行时生成一个值。

  • 标识:数据库在插入一行时生成一个值。

  • :数据库不生成值。

[DatabaseGenerated(DatabaseGenerationOption.Computed)]
public string Something { get; set; }

【讨论】:

  • notmapped 不会在数据库中创建该特定列。但是,我正在从数据库端设置计算列值。会不会有影响?
  • @gopip 你不能把它传回给客户端
  • @GopiP 给你一个更完整的答案
【解决方案2】:

在计算列服务器端时,正确的方法是在上下文级别配置字段:

如果您使用NotMapped您将无法获得数据库中的值。

【讨论】:

  • 我看到每当数据库中的特定行发生更新时,使用 HasComputedColumnSql 会更新所有行?这是正确的行为还是我错过了什么!
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多