Subsonic 3 Сохранить (), затем Обновить ()?

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

Итак, я попытался сделать это примерно так:

newsObj = new news();
newsObj.name = "test"
newsObj.Save();
newsObj.url = String.Format("blah.aspx?p={0}",newsObj.col_id);
newsObj.Save();

Но он не обрабатывает его как один и тот же объект данных, поэтому newsObj.col_id всегда возвращается как ноль. Есть ли другой способ сделать это? Я пробовал это на другой странице, и чтобы заставить его работать, мне пришлось установить newsObj.SetIsLoaded(true);

Это фактический блок кода:

page p;

if (pageId > 0)
    p = new page(ps => ps.page_id == pageId);
else
    p = new page();

if (publish)
    p.page_published = 1;

if (User.IsInRole("administrator"))
    p.page_approved = 1;

p.page_section = staticParent.page_section;
p.page_name = PageName.Text;
p.page_parent = parentPageId;
p.page_last_modified_date = DateTime.Now;
p.page_last_modified_by = (Guid)Membership.GetUser().ProviderUserKey;
p.Add();
string urlString = String.Empty;
if (parentPageId > 0)
{
    urlString = Regex.Replace(staticParent.page_url, "(.aspx).*$", "$1");  // We just want the static page URL (blah.aspx)          
    p.page_url = String.Format("{0}?p={1}", urlString, p.page_id);
}
p.Save();

Если я наведу курсор на p.Save (); Я вижу правильные значения в объекте, но БД никогда не обновляется, и нет никаких исключений. Спасибо!


person Community    schedule 09.09.2009    source источник
comment
Ваш PK int (идентификатор) или что-то еще вроде GUID?   -  person Jim W    schedule 10.09.2009
comment
В одном случае это не так, и это стало проблемой. В другом случае ... это работает и будет работать, только если я сделаю что-то вроде: новая страница (ps = ›ps.page_id == pageId);   -  person    schedule 10.09.2009
comment
Я думаю, это единственный способ сделать это. Если у вас есть автоматический номер (идентификатор на сервере sql, последовательность в Oracle и т. Д.) Для вашего ПК, вам может потребоваться обновить объект, выполнив запрос после его сохранения. Я перешел почти ко всем значениям GUID, поэтому я могу просто создать свой PK с помощью кода, установить значение, а затем сохранить ().   -  person Jim W    schedule 10.09.2009


Ответы (1)


Я столкнулся с той же проблемой:

po oPo = новый po ();

oPo.name = "тест";

oPo.save (); // до сих пор работает.

oPo.name = "test2";

oPo.save (); // на самом деле не работает, данные не сохраняются, поскольку для isLoaded установлено значение false, а столбцы не считаются грязными.

это ошибка в ActiveRecord.tt для версии 3.0.0.3.

В методе public void Add (поставщик IDataProvider) сразу после SetIsNew (false); там должно быть: SetIsLoaded (true);

Причина, по которой сохранение не работает во второй раз, заключается в том, что объект не может испачкаться, если он не загружен. Добавив SetIsLoaded (true) в ActiveRecord.tt, когда вы собираетесь запустить собственный инструмент, он будет идеально регенерировать .cs.

person Sylvain Cyr    schedule 14.01.2010