При использовании клиента / сервера db4o обновления не работают для свойств коллекции объекта.Я использую прозрачную настойчивость, но это не помогает.Затем я изменил свойство Collection на ActivatableCollection, но не повезло.
Это настройка сервера:
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;
}
}