我有一个棘手的问题但我会尽我所能。
我有两个班级:
BlogPost
有一个公共属性HashSet<BlogTag> Tags
,一组博客标记,非常简单。我想要实现的是向我的表dbo.BlogPost添加一个新的BlogPost
,然后遍历标签的HashSet并更新一个单独的表dbo.BlogTags,例如集合中的每个标签和它所属的帖子的ID。
我会这样做: -
public static void AddPost(BlogPost post)
{
try
{
Database db = DatabaseFactory.CreateDatabase(Constants.Application.DatabaseName);
DbCommand cmd = db.GetStoredProcCommand("stp_BlogPost_Add");
db.AddInParameter(cmd, "post_title", DbType.String, post.Title);
db.AddInParameter(cmd, "author", DbType.String, post.Author);
db.AddInParameter(cmd, "date_created", DbType.DateTime, DateTime.Now);
db.AddInParameter(cmd, "post_content", DbType.String, post.Content);
//Snip...
//Insert tags
foreach(BlogTag tag in post.Tags)
{
AddNewTags(post.ID, tag.TagText);
}
db.ExecuteNonQuery(cmd);
}
catch (Exception ex)
{
Logging.LogError(ex);
throw;
}
}
然而,我似乎无法解决的问题是:
foreach(BlogTag tag in post.Tags)
{
AddNewTags(post.ID, tag.TagText);
}
上述内容仅在我们具有post.ID
值时才有效,但是,由于这是在AddPost
方法中运行的,因此此时ID仍然是默认值0
(记录的id是表中的PK,并设置为自动递增。
有没有办法直接将HashSet<BlogTags>
作为参数传递给存储过程(值得一提的是我是一个完整的SQL新手),然后一旦stp_BlogPost_Add
过程运行,获取新创建的帖子的ID并将值插入BlogTags表?
或者,除了上述内容之外,是否有一种实现我想做的优选方法?我曾经考虑过将标签简单地存储在BlogPost表中的逗号分隔字符串中,然后在需要时按,
分割,但这看起来并不干净。
任何建议都将不胜感激
答案 0 :(得分:1)
您无法将对象传递给存储过程,因为您的SQL引擎不知道那是什么。您可以将XML字符串传递给它并对其进行操作。如果将对象设置为可序列化,则可以将其序列化为xml字符串并将其传入。它基本上是对象的XML表示形式。
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx