在c#和实体框架中,我如何确保现有记录不能更改,只有在通过检查后才能添加新记录
本文关键字:不能 检查 添加 新记录 记录 框架 实体 确保 何确保 | 更新日期: 2023-09-27 18:21:24
我想在c#6和实体框架6中创建一个简单的总账应用程序,但我想我很难找到合适的设计。
从我(简化)的角度来看,总账是交易的集合,以后可以用来编译相关数据/报告。
我对交易的要求是:
- 一旦交易被添加/过账到总账中,为了确保完整的审计跟踪,就不能更改或删除该交易
- 只有当相应日期在某个(会计)期间时,才能添加新交易记录。其他检查(例如,如果贷方和借方金额匹配)也将适用。
- 现有交易(即早期过账的交易)也应可用,但在加载时,它们不能再通过上述检查(例如,它们可能来自早期会计期间)
以下是我到目前为止的想法:
public class GeneralLedger
{
public int GeneralLedgerId { get; set; }
public DateTime FiscalPeriodStartDate { get; set; }
public DateTime FiscalPeriodEndDate { get; set; }
private ICollection<GeneralLedgerTransaction> _transactions;
public ICollection<GeneralLedgerTransaction> Transactions {
get
{
if (this._transactions != null) {
return this._transactions.ToList().AsReadOnly();
}
else
{
return null;
}
}
}
public void AddTransaction(GeneralLedgerTransaction trx)
{
if (trx.PostingDate < this.FiscalPeriodStartDate || trx.PostingDate > this.FiscalPeriodEndDate)
{
throw new ArgumentOutOfRangeException("invalid booking date");
}
else
{
this._transactions.Add(trx);
}
}
}
public class GeneralLedgerTransaction
{
public int GeneralLedgerTransactionId { get; set; }
public DateTime PostingDate { get; set; }
public virtual ICollection<GeneralLedgerTransactionLine> GeneralLedgerTransactionLines { get; set; }
}
public class GeneralLedgerTransactionLine
{
public int GeneralLedgerTransactionLineId { get; set; }
public int FinancialAccountId { get; set; }
public virtual FinancialAccount FinancialAccount { get; set; }
public int GeneralLedgerTransactionTypeId { get; set; }
public virtual GeneralLedgerTransactionType GeneralLedgerTransactionType { get; set; }
public decimal Amount { get; set; }
}
public class FinancialAccount
{
public int FinancialAccountId { get; set; }
public string Name { get; set; }
}
public class GeneralLedgerTransactionType
{
public int GeneralLedgerTransactionTypeId { get; set; }
public string Name { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<GeneralLedger> GeneralLedgers { get; set; }
public DbSet<GeneralLedgerTransaction> GeneralLedgerTransactions { get; set; }
public DbSet<GeneralLedgerTransactionLine> GeneralLedgerTransactionLines { get; set; }
public DbSet<FinancialAccount> FinancialAccounts { get; set; }
public DbSet<GeneralLedgerTransactionType> GeneralLedgerTransactionTypes { get; set; }
}
现在,由于Transaction
属性返回一个ReadOnly
-列表,并且每个新添加的事务都会根据日期周期规则进行检查,因此,在没有可以删除或更改的现有事务的情况下,这一点非常有效。我还可以看到记录被保存到数据库中。到目前为止,我唯一缺少的是现有记录没有加载到_transactions
。
在不从域类中调用实体框架的情况下,我可以做些什么来使现有事务在_transactions
中可用?或者有没有更好的方法(即更好的设计)来解决这个问题?
经过进一步的调查,我了解到我可以实现我想要的目标,如下所示:
- 将
_transactions
从private
更改为protected virtual
- 将
modelBuilder.Configurations.Add(new GeneralLedger.GeneralLedgerTransactionsMapper());
添加到OnModelCreating
- 创建以下配置类:
public class GeneralLedgerTransactionsMapper : EntityTypeConfiguration<GeneralLedger>
{
public GeneralLedgerTransactionsMapper()
{
HasMany(s => s._transactions);
}
}