代码之家  ›  专栏  ›  技术社区  ›  Kevin Babcock

使用linq to sql onloaded()方法会导致聚合根的序列为空?

c#
  •  1
  • Kevin Babcock  · 技术社区  · 15 年前

    对于用于实体类型的linq to sql onloaded()分部方法,我找不到太多信息。我遇到了一个问题,这一定是因为我不了解该如何使用该方法,或者是我自己的一些其他监督。

    我有一个聚合根帐户,它有一个类型为BalanceHistory的实体集合。我在类中定义了一个名为currentBalance的属性,该属性未映射到源表中的任何列。相反,我使用onloaded将其值设置为BalanceHistory集合中的最新条目。

    partial void OnLoaded()
    {
        var balance = this.BalanceHistory
                          .OrderByDescending(b => b.Datestamp)
                          .First();
        this.CurrentBalance = balance.Value;
    }
    

    BalanceHistory集合与帐户实体一起加载,即它不是延迟加载的。以下是我的DataContext类的加载选项。

    public AccountRepository()
    {
        var connection = ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString;
        this._dataContext = new DbDataContext(connection);
        var options = new DataLoadOptions();
        options.LoadWith<Account>(a => a.BalanceHistory);
        this._dataContext.LoadOptions = options;
    }
    

    我遇到的问题是,每当我尝试从DataContext类中检索帐户对象时,都会收到一个InvalidOperationException,它说“sequence不包含任何元素”。但是,如果使用调试器并查看DataContext对象,我可以看到只缺少帐户对象。BalanceHistory集合中的所有Balance对象都在那里。但是,如果我注释了onloaded方法,那么将毫无错误地检索一组帐户(当然,不会填充currentBalance属性)。

    所以我一定是做错了什么。有人有什么建议吗?除了弄清楚我做错了什么之外,我还想听听关于更好实现的任何想法。

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  2
  •   tvanfosson    15 年前

    假定currentBalance是在部分类实现中添加的属性。在这种情况下,我将在第一次调用属性时计算它,而不是在加载父对象时填充它。

    private decimal? currentBalance;
    public decimal CurrentBalance
    {
        get
        {
             if (!this.currentBalance.HasValue)
             {
                  var balance = this.BalanceHistory
                                    .OrderByDescending(b => b.Datestamp)
                                    .FirstOrDefault();
                  this.currentBalance = balance == null ? 0M : balance.Value;
             }
             return this.currentBalance.Value;
        }
    }