Используя клиент/сервер db4o, обновления не работают для свойств коллекции объекта. Я использую прозрачную настойчивость, но это не помогает. Затем я изменил свойство Collection на ActivatableCollection, но не повезло.db4o Прозрачная устойчивость не работает
Это настройка сервера:
private void StartDatabase()
{
IServerConfiguration serverConfiguration = Db4oClientServer.NewServerConfiguration();
serverConfiguration.Networking.MessageRecipient = this;
serverConfiguration.Common.Add(new TransparentActivationSupport());
serverConfiguration.Common.Add(new TransparentPersistenceSupport());
string db4oDatabasePath = AppDomain.CurrentDomain.BaseDirectory;
string db4oDatabaseFileName = ConfigurationManager.AppSettings["db4oDatabaseFileName"];
int databaseServerPort = Convert.ToInt32(ConfigurationManager.AppSettings["databaseServerPort"], CultureInfo.InvariantCulture);
_db4oServer = Db4oClientServer.OpenServer(serverConfiguration, db4oDatabasePath + db4oDatabaseFileName, databaseServerPort);
string databaseUser = ConfigurationManager.AppSettings["databaseUser"];
string databasePassword = ConfigurationManager.AppSettings["databasePassword"];
_db4oServer.GrantAccess(databaseUser, databasePassword);
}
Это объект, который я хочу сохранить:
public class Application : ActivatableEntity
И это свойство внутри объекта Application:
public ActivatableCollection<TaskBase> Tasks { get; private set; }
Это код клиента для обновления каждого объекта в коллекции:
Application application = (from Application app in db
where app.Name == "Foo"
select app).FirstOrDefault();
foreach (TaskBase task in application.Tasks)
{
task.Description += ".";
}
db.Store(application);
Любопытно, что db.Commit() также не работал.
Есть два обхода, но я предпочел бы сделать это «правильным» способом.
Работать вокруг 1: вызывать db.Store (задача) для каждой задачи по мере внесения изменения.
Работа вокруг 2: Перед вызовом db.Store(), сделайте следующее:
db.Ext().Configure().UpdateDepth(5);
Может кто-нибудь сказать мне, почему список не обновляется?
Если это помогает, вот это класс ActivatableCollection:
public class ActivatableCollection<T> : Collection<T>, IActivatable
{
[Transient]
private IActivator _activator;
/// <summary>
/// Activates the specified purpose.
/// </summary>
/// <param name="purpose">The purpose.</param>
public void Activate(ActivationPurpose purpose)
{
if (this._activator != null)
{
this._activator.Activate(purpose);
}
}
/// <summary>
/// Binds the specified activator.
/// </summary>
/// <param name="activator">The activator.</param>
public void Bind(IActivator activator)
{
if (_activator == activator) { return; }
if (activator != null && null != _activator) { throw new System.InvalidOperationException(); }
_activator = activator;
}
}
Через много проб и ошибок и RTFM, я делаю медленный прогресс. Я узнал, что не использовал прозрачную настойчивость. Похоже, что для конфигурации сервера и клиента требуется конфигурация TransparentPersistenceSupport. И я пропустил, где мне нужно активировать ВКЛЮЧЕНИЕ КАЖДОГО ПОЛУЧЕНИЯ И УСТАНОВКИ В КАЖДОЙ ЛИНИИ. Не очень прозрачно ... –
Это означает, что я должен внедрять ручные геттеры и сеттеры для каждого свойства. Сущности домена не должны ничего знать о уровне персистентности, но этот подход имеет код db4o по всему объекту. Может быть проще просто сохранить каждый объект явно. Я бы сделал это, если бы мог понять, почему добавление нового объекта в существующий список не поддерживает связь между объектом и родительским объектом. Например: Foo имеет свойство List. Когда я делаю Bars.Add (новый Bar()), новый Bar сохраняется, но он не связан с Foo. –