Вставка дубликатов записей LinqToSql с отношениями

У меня странная ситуация, не могу понять причину. При запуске приложения для Windows Phone у меня есть следующий код, в котором я просто создаю несколько Group, затем создаю несколько Account, где ранее созданные Group являются объектами, связанными с 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 задан идентификатор группы, указанный ниже.


person Tim Gabrhel    schedule 16.01.2013    source источник


Ответы (1)


Итак, я наткнулся на решение, но не на ответ.

Я нашел направление из комментария к одному из ответов здесь - LINQ для SQL — где живет ваш DataContext?

Насколько я понимаю, вы по-прежнему хотите, чтобы один DataContext управлял жизненным циклом Entity, чтобы SubmitChanges() работал правильно без повторного присоединения вашего Entity. Правильный? Выбрать->Редактировать->Отправить. В этом случае ваш DataContext находится за пределами области действия метода, и «использование» менее ценно.

В моем классе BaseData, от которого наследуют другие DAO, я добавил статический экземпляр своего контекста данных и просто удалил все использования из DAO, так что теперь они используют один и тот же контекст данных.

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

Поэтому я полагаю, что поскольку я использую здесь тот же экземпляр контекста данных, он может лучше отслеживать сущности, а не новые экземпляры.

person Tim Gabrhel    schedule 16.01.2013
comment
Имейте в виду, что использование одного статического DataContext не рекомендуется. Было бы лучше создать один DataContext в начале вашего метода SampleData и удалить его (используя предложение using) в конце. - person ErikHeemskerk; 01.02.2013