【发布时间】:2010-04-02 14:30:00
【问题描述】:
我一直在阅读有关 NHibernate 和 Microsoft 的实体框架的信息,以针对我的数据访问层执行对象关系映射。我对拥有一个已建立的框架来执行 ORM 的好处很感兴趣,但我很好奇将它用于标准 XML 序列化和反序列化的性能成本。
现在,我在 Oracle 和 SQL Server 中开发存储过程,它们使用 XML 类型作为输入或输出参数,并根据需要返回或分解 XML。我使用自定义数据库命令对象,该对象使用泛型将 XML 结果反序列化为指定的可序列化类。
通过结合使用泛型、xml(反)序列化和 Microsoft 的 DAAB,我得到了一个相当简单的开发流程,无论数据源如何。此外,由于我专门使用存储过程来执行数据库操作,因此我基本上不受数据结构更改的影响。
这是我一直在做的一个过于简单的例子。
static void main() {
testXmlClass test = new test(1);
test.Name = "Foo";
test.Save();
}
// Example Serializable Class ------------------------------------------------
[XmlRootAttribute("test")]
class testXmlClass() {
[XmlElement(Name="id")]
public int ID {set; get;}
[XmlElement(Name="name")]
public string Name {set; get;}
//create an instance of the class loaded with data.
public testXmlClass(int id) {
GenericDBProvider db = new GenericDBProvider();
this = db.ExecuteSerializable("myGetByIDProcedure");
}
//save the class to the database...
public Save() {
GenericDBProvider db = new GenericDBProvider();
db.AddInParameter("myInputParameter", DbType.XML, this);
db.ExecuteSerializableNonQuery("mySaveProcedure");
}
}
// Database Handler ----------------------------------------------------------
class GenericDBProvider {
public T ExecuteSerializable<T>(string commandText) where T : class {
XmlSerializer xml = new XmlSerializer(typeof(T));
// connection and command code is assumed for the purposes of this example.
// the final results basically just come down to...
return xml.Deserialize(commandResults) as T;
}
public void ExecuteSerializableNonQuery(string commandText) {
// once again, connection and command code is assumed...
// basically, just execute the command along with the specified
// parameters which have been serialized.
}
public void AddInParameter(string name, DbType type, object value) {
StringWriter w = new StringWriter();
XmlSerializer x = new XmlSerializer(value.GetType());
//handle serialization for serializable classes.
if (type == DbType.Xml && (value.GetType() != typeof(System.String))) {
x.Serialize(w, value);
w.Close();
// store serialized object in a DbParameterCollection accessible
// to my other methods.
} else {
//handle all other parameter types
}
}
}
我正在启动一个严重依赖数据库操作的新项目。我很想知道我目前的做法在高流量情况下是否可持续,以及我是否应该考虑切换到 NHibernate 或 Microsoft 的实体框架来执行本质上似乎归结为我目前正在做的事情正在做。
感谢您的任何建议。
【问题讨论】: