UniqueConstraint в EmbeddedConfiguration - PullRequest
3 голосов
/ 29 марта 2010

Я только начал использовать db4o на C #, и у меня возникли проблемы с установкой UniqueConstraint на БД ..

вот конфигурация 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;
}

и объект для сериализации:

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

каждый раз, когда я получаю фиксацию некоторых значений, «Ссылка на объект не установлена ​​для экземпляра объекта». Появляется исключение с трассировкой стека, указывающей на UniqueFieldValueConstraint. Также, когда я закомментирую две строки после комментария «Инициализировать индексы», все работает нормально (за исключением того, что вы можете сохранить неуникальные ключи, что является проблемой) ~

Код коммита (на случай, если я тоже что-то не так делаю в этой части:)

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();
    }
}

Помогите пожалуйста? Заранее спасибо ~

1 Ответ

2 голосов
/ 29 марта 2010

Я забыл, что C # использует странные поля поддержки для ярлыков свойств :( Обновил конфигурацию до следующего:

// 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"));

Теперь все отлично работает ~ ^^

...