0

LINQtoSQLを使用する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()が呼び出されたときに発生することです。

これを解決する1つの方法は、新しいコンテキストを作成してを使用することcontext.Attach(entity)です。

于 2012-07-06T15:49:10.937 に答える