Надоело мне руками строить бизнес-классы, пришлось освоить MyGeneration и написать скрипт, который анализирует выбранные таблицы, вьюхи, связи и генерирует классы с DataAccessor'ами.
Вот так выглядит интерфейсная часть скрипта —
На выходе получаем набор файлов вроде этого —
// Auto-generated by MyGeneration using BLToolkit mapping template
using System;
using System.Collections.Generic;
using BLToolkit.Data;
using BLToolkit.DataAccess;
using BLToolkit.Mapping;
namespace PlateBltDemo
{
[TableName("HIG.CAMPUS")]
public class Campus
{
[PrimaryKey,
MapField("ID")] public int Id;
[MapField("CODE")] public string Code;
[MapField("NAME")] public string Name;
[MapField("COMPANY_ID")] public int? CompanyId;
[MapField("COMMENTS")] public string Comments;
[MapField("SOURCE")] public string Source;
[MapField("SOURCE_CD")] public string SourceCd;
[MapField("IUD_FLAG")] public string IudFlag;
[MapField("DATE_CREATED")] public DateTime? DateCreated;
[MapField("DATE_MODIFIED")] public DateTime? DateModified;
[MapField("USER_CREATED")] public string UserCreated;
[MapField("USER_MODIFIED")] public string UserModified;
public Company GetCompany(DbManager db)
{
return DataAccessor.CreateInstance<CompanyAccessor>(db).SelectByKey(CompanyId);
}
}
public abstract class CampusAccessor : OracleDataAccessor<Campus>
{
[SqlQuery("select * from HIG.CAMPUS where ID=:id")]
public abstract List<Campus> GetByIdSql(int id);
[SqlQuery("select * from HIG.CAMPUS where COMPANY_ID=:companyId")]
public abstract List<Campus> GetByCompanyIdSql(int? companyId);
}
}
Также можно помечать таблицы/поля в MyGeneration атрибутами, влияющими на кодогенерацию (например — можно задавать имя Оракловской последовательности, из которой берется следующий Id). Или же можно помечать справочники атрибутом, указывающим, что данную таблицу нужно загружать один раз при первом обращении и впоследствии искать в памяти. В планах — расширить систему таким образом, чтобы на основании метаданных и схемы скрипт полностью генерировал DAL вместе с хранимыми процедурами и юнит тестами.
Сам скрипт находится
здесь