2011-10-07 - ОБНОВЛЕНИЕ:
Это действительно беспокоило меня с тех пор, как вы указали, насколько грязным было решение, даже если оно работало, поэтому я углубился в решение и придумалновая :) или, скорее, модифицированная версия вашей оригинальной, которая, я думаю, делает то, что вы ищете.Я не уверен, что поместить здесь в ответе, но я вызову пару областей, а затем обновлю пример кода в своем блоге до последней версии, как только у меня возникнут проблемы с FTP.
Класс учетной записи - вставьте свой код обратно для методов onAttach и onDetatch (я сделал лямбда-выражения, но в основном это одно и то же).
public Account()
{
_transactions = new EntitySet<Transaction>(
(addedTransaction) =>
{
NotifyPropertyChanging("Account");
addedTransaction.Account = this;
},
(removedTransaction) =>
{
NotifyPropertyChanging("Account");
removedTransaction.Account = null;
});
}
Класс учетной записи - обновлен атрибут Association для EntitySet:
[Association(
Storage = "_transactions",
ThisKey = "AccountId",
OtherKey = "_accountId")]
Класс транзакции - обновлен атрибут Association для EntityRef для добавления отсутствующего ключа и атрибута IsForeignKey:
[Association(
Storage = "_account",
ThisKey = "_accountId",
OtherKey = "AccountId",
IsForeignKey = true)]
Наконец, вот методы обновления, с которыми я тестирую:
// test method
public void AddAccount()
{
Account c1 = new Account() { Tag = DateTime.Now };
accountRepository.Add(c1);
accountRepository.Save();
LoadCollections();
}
// test method
public void AddTransaction()
{
Account c1 = accountRepository.GetLastAccount();
c1.Transactions.Add(new Transaction() { Tag = DateTime.Now });
accountRepository.Save();
LoadCollections();
}
Обратите внимание, что я добавляю Transaction
к Account
- не устанавливая значение Account
для Transaction
при сохранении.Я думаю, что это в сочетании с добавлением параметра IsForeignKey
- это то, чего не хватало в вашей первоначальной попытке решения.Попробуйте это и посмотрите, будет ли это работать лучше для вас.
2011-10-05 - ОБНОВЛЕНИЕ:
ОК - похоже, я что-то упустил в своем первоначальном ответе.Основываясь на комментарии, я думаю, что проблема связана с причудой, связанной с Linq to SQL.Когда я внес следующие изменения в свой исходный проект, он, похоже, сработал.
public void AddTransaction()
{
Account c1 = accountRepository.GetLastAccount();
Transaction t1 = new Transaction() { Account = c1, Tag = DateTime.Now };
c1.Transactions.Add(t1);
transactionRepository.Add(t1);
accountRepository.Save();
transactionRepository.Save();
LoadCollections();
}
По сути, при добавлении объекта Transaction
мне пришлось добавить новый Transaction
в коллекцию Transactions
оригинального Account
объекта.Я не думал, что ты должен был сделать это, но, похоже, это сработало.Дайте мне знать, если это не сработало, и я попробую что-нибудь еще.
Оригинальный ответ:
Я считаю, что это странная привязка данных.Я создал пример, который вы можете загрузить из моего блога, но самое большое изменение, которое я внес в предоставленный вами код, заключалось в замене полей ObservableCollection свойствами:
private ObservableCollection<Account> _accounts = new ObservableCollection<Account>();
public ObservableCollection<Account> Accounts
{
get { return _accounts; }
set
{
if (_accounts == value)
return;
_accounts = value;
NotifyPropertyChanged("Accounts");
}
}
private ObservableCollection<Transaction> _transactions = new ObservableCollection<Transaction>();
public ObservableCollection<Transaction> Transactions
{
get { return _transactions; }
set
{
if (_transactions == value)
return;
_transactions = value;
NotifyPropertyChanged("Transactions");
}
}
Я также удалил код присоединения / отсоединенияпоскольку это действительно не нужно.Вот мой конструктор учетной записи:
public Account()
{
_transactions = new EntitySet<Transaction>();
}
Я не могу сказать из вашего примера, но убедитесь, что в каждой таблице определен PK:
// Account table
[Column(
AutoSync = AutoSync.OnInsert,
DbType = "Int NOT NULL IDENTITY",
IsPrimaryKey = true,
IsDbGenerated = true)]
public int AccountID
{
get { return _AccountID; }
set
{
if (_AccountID == value)
return;
NotifyPropertyChanging("AccountID");
_AccountID = value;
NotifyPropertyChanged("AccountID");
}
}
// Transaction table
[Column(
AutoSync = AutoSync.OnInsert,
DbType = "Int NOT NULL IDENTITY",
IsPrimaryKey = true,
IsDbGenerated = true)]
public int TransactionID
{
get { return _TransactionID; }
set
{
if (_TransactionID == value)
return;
NotifyPropertyChanging("TransactionID");
_TransactionID = value;
NotifyPropertyChanged("TransactionID");
}
}
Вы можете загрузить мою версиюэто приложение от http://chriskoenig.net/upload/WP7EntitySet.zip - просто убедитесь, что вы добавили учетную запись, прежде чем добавлять транзакции:)