Avec le client/serveur db4o, les mises à jour ne fonctionnent pas pour les propriétés de collection d'un objet. J'utilise la persistance transparente, mais cela n'aide pas. Ensuite, j'ai changé ma propriété Collection en ActivatableCollection, mais pas de chance.db4o La persistance transparente ne fonctionne pas
C'est la configuration du serveur:
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);
}
Ceci est l'entité que je veux sauver:
public class Application : ActivatableEntity
Et c'est la propriété de l'entité d'application:
public ActivatableCollection<TaskBase> Tasks { get; private set; }
Il s'agit du code client pour mettre à jour chaque objet de la collection:
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);
Curieusement, db.Commit() ne fonctionnait pas non plus.
Il y a deux solutions, mais je préfère faire cela de la «bonne» manière. Contournement 1: Appelez db.Store (tâche) sur chaque tâche à mesure que la modification est effectuée.
travail autour de 2: Avant d'appeler db.Store(), faites ceci:
db.Ext().Configure().UpdateDepth(5);
Quelqu'un peut-il me dire pourquoi la liste est mise à jour ne pas?
Si elle aide, voici la classe 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;
}
}
Grâce à beaucoup d'essais et d'erreurs, et à RTFM, je progresse lentement. J'ai découvert que je n'utilisais pas la persistance transparente. Il semble que la configuration du serveur et du client nécessite la configuration TransparentPersistenceSupport. Et j'ai manqué où je dois appeler activer ON TOUS GETTER ET SETTER DANS CHAQUE ENTITÉ. Pas très transparent ... –
Cela signifie que je dois implémenter des getters manuels et des setters pour chaque propriété. Les entités de domaine ne devraient rien savoir de la couche de persistance, mais cette approche a du code db4o sur toutes les entités. Il peut être plus facile de sauvegarder chaque objet explicitement. Je le ferais si je pouvais comprendre pourquoi l'ajout d'un nouvel objet à une liste existante ne conserve pas l'association entre l'objet et l'objet parent. Par exemple: Foo a la propriété Liste. Quand je fais Bars.Add (new Bar()), la nouvelle barre est stockée mais elle n'est pas associée à Foo. –