2010-03-28 23 views
3

Je viens de commencer à utiliser db4o sur C#, et je vais avoir du mal à régler la UniqueConstraint sur la DB ..UniqueConstraint dans EmbeddedConfiguration

est ici la configuration db4o

static IObjectContainer db = Db4oEmbedded.OpenFile(dbase.Configuration(), "data.db4o"); 
static IEmbeddedConfiguration Configuration() 
{ 
    IEmbeddedConfiguration dbConfig = Db4oEmbedded.NewConfiguration(); 
    // Initialize Replication 
    dbConfig.File.GenerateUUIDs = ConfigScope.Globally; 
    dbConfig.File.GenerateVersionNumbers = ConfigScope.Globally; 
    // Initialize Indexes 
    dbConfig.Common.ObjectClass(typeof(DAObs.Environment)).ObjectField("Key").Indexed(true); 
    dbConfig.Common.Add(new Db4objects.Db4o.Constraints.UniqueFieldValueConstraint(typeof(DAObs.Environment), "Key")); 
    return dbConfig; 
} 

et l'objet à sérialiser:

class Environment 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

chaque fois que j'arrive à valider des valeurs, une «référence d'objet non définie sur une instance d'un objet». Une exception apparaît, avec une trace de pile pointant vers UniqueFieldValueConstraint. En outre, lorsque je commente les deux lignes après le commentaire "Initialize Indexes", tout fonctionne bien (sauf que vous pouvez enregistrer des clés non uniques, ce qui est un problème) ~

Commit code (Au cas où je fais quelque chose mauvais dans cette partie aussi :)

public static void Create(string key, string value) 
{ 
    try 
    { 
     db.Store(new DAObs.Environment() { Key = key, Value = value }); 
     db.Commit(); 
    } 
    catch (Db4objects.Db4o.Events.EventException ex) 
    { 
     System.Console.WriteLine 
      (DateTime.Now + " :: Environment.Create\n" + ex.InnerException.Message +"\n" + ex.InnerException.StackTrace); 
     db.Rollback(); 
    } 
} 

Aide s'il vous plaît? Merci à l'avance ~

Répondre

2

j'ai oublié que C# utilise des champs de support étranges pour les raccourcis de propriété :(Mise à jour de la configuration à ce qui suit:

// Initialize Indexes 
dbConfig.Common.ObjectClass(typeof(DAObs.Environment)) 
    .ObjectField("<Key>k__BackingField").Indexed(true); 
dbConfig.Common.Add(new Db4objects.Db4o.Constraints. 
    UniqueFieldValueConstraint(typeof(DAObs.Environment), "<Key>k__BackingField")); 

Tout fonctionne bien maintenant ~ ^^

+0

2 Merci J'utilise Java, Java est-il affecté par les champs de support? – Viet

+0

Est-ce que Java a des propriétés, n'est-ce pas Java en utilisant toutes ces méthodes getter et setter, ou suis-je en retard de quelques années? – mnemosyn

+1

Merci pour ce sujet et réponse avec le "tour" – binball