0

原因がわからない奇妙な状況があります。Windows Phone アプリの起動時に、いくつかの を作成してから、以前に作成した が に関連するオブジェクトであるGroupをいくつか作成する次のコードがあります。AccountGroupAccount

public async static void SampleData()
{
     var grp1 = await Manager.GroupManager.SaveGroupAsync(new Group { GroupName = "Wells Fargo" });
     var grp2 = await Manager.GroupManager.SaveGroupAsync(new Group { GroupName = "Chase" });
     var grp3 = await Manager.GroupManager.SaveGroupAsync(new Group { GroupName = "Citi" });

     var acct1 = await Manager.AccountManager.SaveAccountAsync(new Account { AccountName = "Spending", AccountType = (int)Enums.AccountType.Banking, Group = grp1 }); //0
     var acct2 = await Manager.AccountManager.SaveAccountAsync(new Account { AccountName = "Credit Card", AccountType = (int)Enums.AccountType.Credit, Group = grp1 }); //1
     var acct3 = await Manager.AccountManager.SaveAccountAsync(new Account { AccountName = "Mortgage", AccountType = (int)Enums.AccountType.Banking, Group = grp2 }); //2
     var acct4 = await Manager.AccountManager.SaveAccountAsync(new Account { AccountName = "Savings", AccountType = (int)Enums.AccountType.Banking, Group = grp2 }); //3
     var acct5 = await Manager.AccountManager.SaveAccountAsync(new Account { AccountName = "Spending", AccountType = (int)Enums.AccountType.Banking, Group = grp2 }); //4
     var acct6 = await Manager.AccountManager.SaveAccountAsync(new Account { AccountName = "Credit Card", AccountType = (int)Enums.AccountType.Credit, Group = grp3 }); //5
}

それぞれの方法:

マネージャー

public async static Task<Group> SaveGroupAsync(Group group)
{
    await DataAccess.GroupData.SaveGroupAsync(group);

    return group;
}

public async static Task<Account> SaveAccountAsync(Account account)
{
    await DataAccess.AccountData.SaveAccountAsync(account);

    return account;
}

データアクセス

public async static Task<Group> SaveGroupAsync(Group group)
{
    using (var dc = new CbmDataContext(DBHelper.LocalConnectionString))
    {
        if (group.GroupId == 0)
            dc.Groups.InsertOnSubmit(group);

        dc.SubmitChanges();

        return group;
    }
}

public async static Task<Account> SaveAccountAsync(Account account)
{
    using (var dc = new CbmDataContext(DBHelper.LocalConnectionString))
    {
        if (account.AccountId == 0)
            dc.Accounts.InsertOnSubmit(account);

        dc.SubmitChanges();

        return account;
    }
}

グループの最初の 3 つの保存を実行すると、3 つの新しいオブジェクトが挿入されます。これは私の予想される動作です。最初の新しいアカウントに対してコードを実行すると、新しいアカウントが表示されますが、参照されたアカウントのグループ テーブルにも新しいエントリが表示されます。同じ名前の 2 つのグループになってしまいます。

これが発生するのを許している私は何を間違っていますか? Account.GroupId が、以下に設定されているグループの Id に設定されていることがわかります。

4

1 に答える 1

0

だから私は解決策に出くわしましたが、それほど答えはありませんでした。

ここでの回答の 1 つ - LINQ to SQL - where does your DataContext live?のコメントから方向性を見つけました。

私が理解しているように、エンティティを再アタッチせずに SubmitChanges() が正しく機能するように、1 つの DataContext でエンティティのライフサイクルを管理する必要があります。正しい?フェッチ -> 編集 -> 送信。その場合、DataContext はメソッド スコープの外にあり、「使用」の価値は低くなります。

他の DAO が継承する BaseData クラスで、データ コンテキストの静的インスタンスをスローし、DAO からすべての using を削除したので、同じデータ コンテキストを使用しています。

public static CbmDataContext dc = new CbmDataContext(DBHelper.LocalConnectionString);

ここでデータ コンテキストの同じインスタンスを使用しているため、新しいインスタンスよりもエンティティをより適切に追跡できると思います。

于 2013-01-16T14:38:41.967 に答える