0

我有一个奇怪的情况,我无法弄清楚原因。在启动 Windows Phone 应用程序时,我有以下代码,其中我只是创建了一些Groups,然后创建了一些Accounts,其中先前创建Group的 s 是与 s 相关的对象Account

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

所以我偶然发现了一个解决方案,但不是一个答案。

我从这里的一个答案的评论中找到了方向 - LINQ to SQL - 你的 DataContext 住在哪里?

据我了解,您仍然需要一个 DataContext 来管理实体的生命周期,以便 SubmitChanges() 能够在不重新附加实体的情况下正常工作。正确的?获取->编辑->提交。在这种情况下,您的 DataContext 位于方法范围之外,并且“使用”的价值较低。

在其他 DAO 继承自 BaseData 类上,我抛出了我的数据上下文的静态实例,并刚刚从 DAO 中删除了所有使用,所以现在它们使用相同的数据上下文。

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

所以我想因为我在这里使用相同的数据上下文实例,它能够更好地跟踪实体,而不是新实例。

于 2013-01-16T14:38:41.967 回答