在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中可用?或者有没有更好的方法(即更好的设计)来解决这个问题?

在c#和实体框架中,我如何确保现有记录不能更改,只有在通过检查后才能添加新记录

经过进一步的调查,我了解到我可以实现我想要的目标,如下所示:

  • _transactionsprivate更改为protected virtual
  • modelBuilder.Configurations.Add(new GeneralLedger.GeneralLedgerTransactionsMapper());添加到OnModelCreating
  • 创建以下配置类:

public class GeneralLedgerTransactionsMapper : EntityTypeConfiguration<GeneralLedger>
    {
        public GeneralLedgerTransactionsMapper()
        {
            HasMany(s => s._transactions);
        }
    }