Инструменты генерации кода, такие как те, которые используются в решениях O / RM, могут создавать классы для вас (их называют многими вещами, но я называю их моделями).
Не совсем понятно, что вам нужно (прочитав также ваши комментарии), но вы можете использовать эти инструменты для создания чего угодно, а не только моделей.Вы можете создавать классы, которые содержат списки ассоциаций полей / свойств или флаги схемы базы данных, такие как «Поле X <-> Флаг первичного ключа» и т. Д.
Некоторые из них уже есть, но если выВы можете построить весь O / RM самостоятельно, вы можете (я сделал).Но это гораздо больший вопрос :) Обычно он включает добавление кода, который знает, как запрашивать, вставлять, удалять и обновлять ваши модели в базе данных (так называемые методы CRUD).Это не сложно, но тогда вы лишаете себя возможности интегрироваться с элементами управления данными Delphi, и вам нужно будет найти решение для этого.Хотя вам не нужно генерировать методы CRUD, поддержка CRUD необходима для того, чтобы полностью исключить необходимость ручных изменений для последующей адаптации к изменениям схемы базы данных.
В одном из ваших комментариев указано, что вы хотите создать какую-то схемуЗапросы без использования подключения к базе данных.Это правильно?Я делаю это в своих моделях, украшая их атрибутами, которые я могу запрашивать во время выполнения.Для этого требуется Delphi 2010 и его новый RTTI.Например:
[TPrimaryKey]
[TField('EmployeeID', TFieldType.Integer)]
property EmployeeID: integer read GetEmployeeID write SetEmployeeID;
Используя RTTI, я могу взять экземпляр модели и спросить, какое поле представляет первичный ключ, ища тот, который имеет атрибут TPrimaryKeyAttribute.Использование атрибута TField выше обеспечивает связь между свойством и полем базы данных, где они не обязательно должны иметь одинаковые имена.Он может даже предоставить класс преобразования в качестве параметра, так что они не должны иметь одинаковый тип.Есть много возможностей.
Я использую MyGeneration и пишу свои собственные шаблоны для этого.Это просто и открывает целый мир возможностей для вас, даже за пределами O / RM.
MyGeneration (бесплатный инструмент генерации кода) http://www.mygenerationsoftware.com/ http://sourceforge.net/projects/mygeneration/
Учебник MyGeneration (мой блог) http://interactiveasp.net/blogs/spgilmore/archive/2009/12/03/getting-started-with-mygeneration-a-primer-and-tutorial.aspx
Я потратил около 15 минут, чтобы написать скрипт MyGeneration, который делает то, что вы хотите.Вам нужно будет определить ваши типы Delphi для базы данных, которую вы используете в XML, но этот скрипт сделает все остальное.Я не тестировал его, и он, вероятно, захочет его расширить, но он даст вам представление о том, с чем вы столкнулись.
<%# reference assembly = "System.Text"%><%
public class GeneratedTemplate : DotNetScriptTemplate
{
public GeneratedTemplate(ZeusContext context) : base(context) {}
private string Tab()
{
return Tab(1);
}
private string Tab(int tabCount)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int j = 0; j < 1; j++)
sb.Append(" "); // Two spaces
return sb.ToString();
}
//---------------------------------------------------
// Render() is where you want to write your logic
//---------------------------------------------------
public override void Render()
{
IDatabase db = MyMeta.Databases[0];
%>unit ModelsUnit;
interface
uses
SysUtils;
type
<%
foreach (ITable table in db.Tables)
{
%>
<%=Tab()%>T<%=table.Name%>Model = class(TObject)
<%=Tab()%>protected
<% foreach (IColumn col in table.Columns)
{
%><%=Tab()%><%=Tab()%>f<%=col.Name%>: <%=col.LanguageType%>;
<% }%>
<%=Tab()%>public
<% foreach (IColumn col in table.Columns)
{
%><%=Tab()%><%=Tab()%>property <%=col.Name%>: <%=col.LanguageType%> read f<%=col.Name%> write f<%=col.Name%>;
<% }%>
<%=Tab()%><%=Tab()%>
<%=Tab()%>end;<%
}
%>
implementation
end.
<%
}
}
%>
Вот один из сгенерированных классов таблицпо приведенному выше сценарию:
TLOCATIONModel = class(TObject)
protected
fLOCATIONID: integer;
fCITY: string;
fPROVINCE: string;
public
property LOCATIONID: integer read fLOCATIONID write fLOCATIONID;
property CITY: string read fCITY write fCITY;
property PROVINCE: string read fPROVINCE write fPROVINCE;
end;