【问题标题】:Getting the result of a computed column from database into an entity将计算列的结果从数据库获取到实体中
【发布时间】:2018-09-11 14:21:29
【问题描述】:

在使用实体框架的项目中,假设我有一个实体,例如

[Table("MyTable")]
public partial class MyTable
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [DatabaseGenerated( DatabaseGeneratedOption.Computed)]
    public string FullName { get; set; }
}

FullName 在 SQL Server 2012 数据库上计算为 FirstNameLastName 的串联。

在项目开始时,整个表完全在本地加载。即通过DbContext.DbSet<MyTable>.Load()

在运行时我是

  1. 在代码中创建 this 的实例
  2. 设置此对象的名字和姓氏属性。
  3. 将此实例添加到DbContextDbSet
  4. 致电DbContext.SaveChanges()

现在,在调用SaveChanges() 之后,我期望实体的FullName 计算属性将填充计算值。但遗憾的是,这似乎没有发生?

如何从数据库中获取计算值到我的实体对象中?

【问题讨论】:

  • Maybe this helps。或者,您可以将 NotMapped 属性 (System.ComponentModel.DataAnnotations.Schema.NotMappedAttribute) 添加到您的 FullName 并将其设置器更改为 get { return $"{this.LastName}, {this.FirstName}"; }

标签: c# sql-server entity-framework entity-framework-6 ef-code-first


【解决方案1】:

FullName 在 SQL Server 2012 数据库中计算为 FirstNameLastName 的串联。

好吧,由于您使用的是 EF-Code First,因此您没有将它们连接到类中的 FullName 属性中,因此您应该在 getter 中指定它,如下所示:

get { return string.Format("{0} {1}", FirstName, LastName); }

或者使用更新版本的 C#,您可以:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string FullName => $"{FirstName} {LastName}";

【讨论】:

  • 嗨,我希望我不需要从数据库中复制逻辑。您是说 Entity Framework 不提供取回计算值的功能吗?
  • @Cleve 好吧,您使用的是 EF-Code First。您如何期望它知道您所说的 FullName 是什么意思?
  • 我期待 EF 从数据库中编组返回计算值。这就是我希望它知道 FullName 是什么的方式。
  • @Cleve 你能解释一下“我希望我不需要复制数据库中的逻辑”......?我在您的问题中看不到任何逻辑。
  • @gldraphael ,计算全名的逻辑在数据库中。如果我通过将连接逻辑放入我的类的 FullName 属性来采用上述建议,那么这个逻辑将在数据库中的类 AND 中。重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多