1. ホーム
  2. c#

[解決済み] EF Code Firstの計算カラム

2023-02-16 14:04:32

質問

データベースで、(行の合計) - (行の合計) としてデータベースによって計算される1つの列を持つ必要があります。私は私のデータベースを作成するためにコードファーストモデルを使用しています。

以下は私が言いたいことです。

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で実現するにはどうしたらよいでしょうか?

どのように解決するのですか?

あなたが作成することができます 計算されたカラム を作成できます。EF モデルでは、対応するプロパティを DatabaseGenerated 属性でアノテーションします。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public double Summ { get; private set; } 

あるいはフルエントマッピングで

modelBuilder.Entity<Income>().Property(t => t.Summ)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)

によって提案されたように マティヤ・グルチッチ とコメントで提案されているように、プロパティを private set というのは、アプリケーションコードでそれを設定したいことはおそらく決してないからです。Entity Frameworkは、プライベートなセッターに問題はありません。

注意してください。 EF .NET Coreの場合は、以下のように ValueGeneratedOnAddOrUpdateを使用する必要があります。 のように、HasDatabaseGeneratedOptionが存在しないので、例えば、以下のようにします。

modelBuilder.Entity<Income>().Property(t => t.Summ)
    .ValueGeneratedOnAddOrUpdate()