首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF代码中的计算列优先

EF代码中的计算列优先
EN

Stack Overflow用户
提问于 2013-03-23 17:44:42
回答 7查看 98.5K关注 0票数 92

我需要在我的数据库中有一列由数据库计算为(总行)-(总行b)。我正在使用代码优先模型来创建我的数据库。

我的意思是:

代码语言:javascript
复制
public class Income {
      [Key]
      public int UserID { get; set; }
      public double inSum { get; set; }
}

public class Outcome {
      [Key]
      public int UserID { get; set; }
      public double outSum { get; set; }
}

public class FirstTable {
      [Key]
      public int UserID { get; set; }
      public double Sum { get; set; } 
      // This needs to be calculated by DB as 
      // ( Select sum(inSum) FROM Income WHERE UserID = this.UserID) 
      // - (Select sum(outSum) FROM Outcome WHERE UserID = this.UserID)
}

如何在EF CodeFirst中实现这一点?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-23 18:04:42

您可以在数据库表中创建computed columns。在EF模型中,您只需使用DatabaseGenerated属性注释相应的属性:

代码语言:javascript
复制
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public double Summ { get; private set; } 

或者使用流畅的贴图:

代码语言:javascript
复制
modelBuilder.Entity<Income>().Property(t => t.Summ)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)

正如Matija Grcic和评论中所建议的,将属性设置为private set是一个好主意,因为您可能永远不想在应用程序代码中设置它。Entity Framework对私有setter没有问题。

注意:用于EF .NET核心的您应该使用ValueGeneratedOnAddOrUpdate,因为HasDatabaseGeneratedOption不存在,例如:

代码语言:javascript
复制
modelBuilder.Entity<Income>().Property(t => t.Summ)
    .ValueGeneratedOnAddOrUpdate()
票数 148
EN

Stack Overflow用户

发布于 2013-03-23 18:09:30

代码语言:javascript
复制
public string ChargePointText { get; set; }

public class FirstTable 
{
    [Key]
    public int UserID { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]      
    public string Summ 
    {
        get { return /* do your sum here */ }
        private set { /* needed for EF */ }
    }
}

参考文献:

  • Bug in EF 4.1 DatabaseGeneratedOption.Computed
  • Calculated Columns in Entity Framework Code First Migrations
  • Working with Computed Columns
票数 39
EN

Stack Overflow用户

发布于 2019-02-19 01:44:32

自2019年起,EF核心支持您使用fluent API以干净的方式计算列:

假设DisplayName是您要定义的计算列,则必须像往常一样定义该属性,并可能使用私有属性访问器来防止对其赋值

代码语言:javascript
复制
public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    // this will be computed
    public string DisplayName { get; private set; }
}

然后,在模型构建器中,使用列定义对其进行寻址:

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .Property(p => p.DisplayName)
        // here is the computed query definition
        .HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
}

有关更多信息,请查看MSDN

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15585330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档