【问题标题】:Subsonic 3 Save() then Update()?亚音速 3 保存()然后更新()?
【发布时间】:2009-09-09 21:24:44
【问题描述】:

我需要获取一行的主键,然后将其插入到字符串中的其他列中。

所以我尝试这样做:

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();我可以在对象中看到正确的值,但数据库永远不会更新,也不例外。 谢谢!

【问题讨论】:

  • 您的 PK 是 int(身份)还是其他类似 GUID 的东西?
  • 在一种情况下不是这样,这最终成为了问题。在另一种情况下......它只有在我执行以下操作时才会起作用:new page(ps => ps.page_id == pageId);
  • 我认为这是唯一的方法。如果您的 PK 有一个自动编号(sql server 中的标识、Oracle 中的序列等),那么您可能需要在保存对象后通过查询来刷新该对象。我已经转移到几乎所有的 GUID 值,所以我可以通过代码创建我的 PK,设置值,然后 Save()。

标签: subsonic3


【解决方案1】:

我遇到了同样的问题:

po oPo = 新 po();

oPo.name ="测试";

oPo.save(); //到现在为止它可以工作了。

oPo.name = "test2";

oPo.save(); //没有真正工作,它没有保存数据,因为 isLoaded 设置为 false 并且列不被认为是脏的。

这是版本 3.0.0.3 的 ActiveRecord.tt 中的错误。

在方法 public void Add(IDataProvider provider) 紧接在 SetIsNew(false) 之后; 应该有:SetIsLoaded(true);

第二次保存不工作的原因是因为如果没有加载对象就不会变脏。通过在 ActiveRecord.tt 中添加 SetIsLoaded(true),当您要运行自定义工具时,它将完美地重新生成 .cs。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多