0

我在测试使用 LINQ to SQL 的 DAL 库时遇到问题

正在测试的方法如下(一个简单的):

public List<tblAccount> GetAccountsByCustomer(tblCustomer customer)
{
    using (OnlineBankingDataClassesDataContext dbcntx = new OnlineBankingDataClassesDataContext())
    {
        var accounts = dbcntx.tblAccounts.Where(p => p.tblCustomer.ID.CompareTo(customer.ID)==0);
        return accounts.ToList<tblAccount>();
    }
}

测试代码如下:

static tblCustomer GetTopOneCustomer()
{
    OnlineBankingDataClassesDataContext dbcntx = new OnlineBankingDataClassesDataContext();
    var customers = dbcntx.tblCustomers.Take(1);
    return customers.Single<tblCustomer>();
}

public static void Should_List_All_Account_By_Customer()
{

    tblCustomer customer = GetTopOneCustomer();

    DataController dc = new DataController();
    List<tblAccount> accounts=dc.GetAccountsByCustomer(customer);
    foreach (tblAccount account in accounts)
    {
        string accountdetails=string.Format("Account ID:{0} \n Account Type:{1} \n Balance:{2} \n BranchName:{3} \n AccountNumber:{4}",
                        account.ID.ToString(), account.tblAccountType.Name, 
                        account.Balance.ToString(),
                        account.tblBranch.Name, account.Number);

        Console.WriteLine(accountdetails);

    }
}

我收到错误消息“无法访问已处置的对象”。在这种情况下访问关联对象时,我使用的是account.tblAccountType.Name. 我知道这与DataContext. 我该如何让这段代码工作。

4

2 回答 2

1

dbcntx是一次性物品。垃圾收集器可以在GetTopOneCustomer()被调用后的任何时间出现并处理它。这就是看起来正在发生的事情。

尝试更改GetTopOneCustomer()为:

static tblCustomer GetTopOneCustomer(OnlineBankingDataClassesDataContext dataContext) 
{
    //Stuff
}

然后在里面Should_List_All_Account_By_Customer()改变它:

using (OnlineBankingDataClassesDataContext dataContext = new OnlineBankingDataClassesDataContext())
{
    tblCustomer customer = GetTopOneCustomer(dataContext); 
    //More Stuff
}

这样您就可以控制dataContext.

于 2012-07-06T15:47:04.627 回答
0

由于 DataContext 在 using 语句中,using (OnlineBankingDataClassesDataContext dbcntx = new OnlineBankingDataClassesDataContext()) 一旦上下文超出范围,就会调用 Disposed。这会导致所有实体都被分离,并且需要 DataContext 的实体上的所有操作都将失败。account.Balance.ToString()这就是调用时发生的情况。

解决这个问题的一种方法是创建一个新的上下文并使用context.Attach(entity).

于 2012-07-06T15:49:10.937 回答