次のようなInitial:Migrationファイルを使用してデータベースに列を作成しようとしています。this guide。データベース作成の計算フィールドの作成CodeFirst/EntityFramework
私はTransaction
テーブルとAccount
テーブルを持っています。私はAccount
プロパティReconciledBalance
を生成しようとしています。 IsReconciled
が真で、IsActive
が真である取引のすべての残高の合計を計算する必要があります。
// Example of calculation
ReconciledBalance = Transactions.Where(t => t.IsActive == true && t.IsReconciled == true).Sum(x => x.Amount)
これは、計算された列で達成したいことです。私が近づいているのか、あるいは正しい方向に向かっているのか疑問に思っています。どんな助けもありがとう!
// Initial.cs file
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Accounts",
c => new
{
Id = c.Int(nullable: false, identity: true),
IsActive = c.Boolean(),
Name = c.String(),
Balance = c.Decimal(nullable: false, precision: 18, scale: 2),
//ReconciledBalance = c.Decimal(),
HouseholdId = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Households", t => t.HouseholdId);
Sql("ALTER TABLE dbo.Accounts NOT SURE WHAT TO PUT HERE");
}
public override void Down()
{
//AlterColumn("dbo.Accounts", "ReconciledBalance", c => c.Decimal(nullable: false, precision: 18, scale: 2));
DropTable("dbo.Accounts");
}
}
//Account Model
public class Account
{
public Account()
{
this.Transactions = new HashSet<Transaction>();
}
public int Id { get; set; }
public bool IsActive { get; set; }
public string Name { get; set; }
[Range(double.MinValue, double.MaxValue)]
public decimal Balance { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Range(double.MinValue, double.MaxValue)]
public decimal ReconciledBalance{ get; set; }
}
//FKs
public int HouseholdId { get; set; }
//Virtual Properties
public virtual Household Household { get; set; }// One to one
public virtual ICollection<Transaction> Transactions { get; set; }
}
// Account Transaction
public class Transaction
{
public Transaction()
{
}
public int Id { get; set; }
public bool IsActive { get; set; }
[DisplayFormat(DataFormatString = "{0:g}", ApplyFormatInEditMode = true)]
public DateTimeOffset Date { get; set; }
[StringLength(150, ErrorMessage ="Description cannot exceed 150 characters.")]
public string Description { get; set; }
[Range(double.MinValue, double.MaxValue)]
public decimal Amount { get; set; }
public bool IsReconciled { get; set; }
public bool IsExpense { get; set; }
[Range(double.MinValue, double.MaxValue)]
public decimal ReconciledAmount { get; set; }
//FKs
public int CategoryId { get; set; }
public string EnteredById { get; set; }
public int AccountId { get; set; }
//Virtual Properties
public virtual Category Category { get; set; }
public virtual ApplicationUser EnteredBy { get; set; }
public virtual Account Account { get; set; }
}
データベースで計算したい場合は、計算されたフィールドを持つデータベースビューに「Account」エンティティをリンクするか、トランザクションテーブルでトリガを使用する必要があります。 – Colin
私はこれを私のalter tableステートメントで遠くまで得ました。 'Sql(" ALTER TABLE dbo.Accounts ADD ReconciledBalance Decimal SELECT SUM(Amount)FROM [トランザクション] WHERE IsReconciled = 1またはIsActive = 1またはIsVoid = 0 ");' しかし、計算フィールドを追加していません。私はこれをSQLで実行しようとしましたが、フィールドを作成していません。私はOPにリンクしている文書から、私はAS演算子が必要なように見えますが、SQLはそこにあるときにSQLが好きではありません。何か案は? –
'Sql(" ALTER TABLE dbo.Accounts ADD ReconciledBalance Decimal AS SELECT SUM(Amount)FROM [トランザクション] WHERE IsReconciled = 1またはIsActive = 1またはIsVoid = 0 ");'を試してください。私はSQLでそれほど素晴らしいとは言えませんが、私はただ助けようとしています。 –