Я читал о NHibernate и Microsoft Entity Framework для выполнения объектно-реляционного сопоставления с моим уровнем доступа к данным. Я заинтересован в преимуществах наличия установленной среды для выполнения ORM, но мне любопытно узнать о затратах на производительность при ее использовании по сравнению со стандартной сериализацией и десериализацией XML.
Сейчас я разрабатываю хранимые процедуры в Oracle и SQL Server, которые используют типы XML для входных или выходных параметров и возвращают или уничтожают XML в зависимости от необходимости. Я использую пользовательский объект команды базы данных, который использует обобщенные значения для десериализации результатов XML в указанный сериализуемый класс.
Используя комбинацию обобщений, сериализации xml (de) и DAAB от Microsoft, я получил процесс, который довольно просто разрабатывать независимо от источника данных. Более того, поскольку я использую исключительно хранимые процедуры для выполнения операций с базой данных, я в основном защищен от изменений в структуре данных.
Вот упрощенный пример того, что я делал.
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 Entity Framework, чтобы выполнить то, что по сути сводится к тому же, что и сейчас делает.
Я ценю любой совет, который вы можете дать.