N уровней с SubSonic 3, коллекция Dirty Columns всегда пуста при обновлении - PullRequest
1 голос
/ 16 июля 2009

Вот что я делаю, а не работаю для меня.

У меня есть DAL, сгенерированный с помощью шаблона SubSonic 3 ActiveRecord, у меня есть сервисный уровень (бизнес-уровень, если вы хорошо), который имеет смесь фасада и некоторой проверки.

Скажем, у меня есть метод на сервисном уровне, например public void UpdateClient (клиентский клиент); в моем графическом интерфейсе я создаю объект Client, заполняю его некоторыми данными с идентификатором и передаю его методу service, и это никогда не работало, коллекция грязных столбцов (которые отслеживают, какие столбцы изменены, чтобы использовать более эффективный оператор обновления) всегда пуст .

Если я попытался получить объект из базы данных внутри моего графического интерфейса, затем передать его методу сервиса, он тоже не работает.

Единственный сценарий, который я нахожу работающим, - это если я запрашиваю объект из базы данных и вызываю Update () в одном и том же контексте внутри моего GUI, и это разрушает весь созданный мной сервисный слой.

Однако для вставки и удаления всего, что работает нормально, мне интересно, нужно ли это что-то делать с отслеживанием объектов, но я знаю, что SubSonic этого не делает.

Пожалуйста, совет. Благодарю. Адель.

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

Кажется, это особенность, а не ошибка. Subsonic помечает столбец как грязный, только если объект загружен из БД. Таким образом, вы не можете сохранить объект или объект, добавить изменения в его свойства и затем сохранить его снова. Пойди разберись.

bool _MyProp;
public bool MyProp
{
    get { return _MyProp; }
    set
    {
        if(_MyProp!=value){
            _MyProp=value;
            var col=tbl.Columns.SingleOrDefault(x=>x.Name=="MyProp");
            if(col!=null){
                if(!_dirtyColumns.Any(x=>x.Name==col.Name) && **_isLoaded**){
                    _dirtyColumns.Add(col);
                }
            }
            OnChanged();
        }
    }
}

Посмотрите, как переменная-член _isLoaded имеет значение false, если объект действительно не загружен из БД. Subsonic никогда не добавляет мое свойство в список грязных столбцов.

Ваш метод репозитория Save () должен выглядеть примерно так:

public MyObject Save(Myobject myObject)
{
    myObject.Save();
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id);
    return myObject;
}
1 голос
/ 11 августа 2010

Вместо:

public MyObject Save(Myobject myObject) 
{ 
    myObject.Save(); 
    myObject= MyObject.SingleOrDefault(x => x.Id == myObject.Id); 
    return myObject; 
} 

Вы можете сделать:

myObject.SetIsLoaded(true);

Это избавляет от необходимости повторного запроса к серверу базы данных.

Например:

myObject.Save();
myObject.Name ="Something else";
myObject.SetIsLoaded(true);
myObject.Save(); 
...