- все классы, члены класса именуются PascalCasing;
- у класса должен быть комментарий и все его члены должны быть прокомментированны;
- должен быть namespace;
- имя класса в единственном числе;
- класс должен быть описан в отдельном файле;
- если конструктор используется по умолчанию, то дефолтный который создает IDE удалять;
- не выдумывать имя свойства для Cправочника, например назвать поле Name, а не CountryName или type_name
- не выдумывать имена основных методов(CRUD) см.пример, использовать:
- Get()
- GetById(id)
- Update()
- Create()
- Delete()
- в свойствах не должно быть получение других классов, а получать через методы
// хорошо
public bool IsDelete => DeleteUserID != null;
// плохо
public string office { get => dic_company_users_office.GetDefaultOfficeUser(id)._officeName; }
// хорошо
public Bid GetBid(){...}
- не создовать в модели лишние методы которые получают определенные поля или обновляют какое то определенное поле, например не писать так GetUserName(), UpdateFio()
- поля(внешние ключи) писать например CountryID, UserID, ClientID, а не country_id, IdUser._
- Использовать Dapper для работы с БД.
- Для справочника должны быть поля статус, дата создания, кто создал, дата удаления, кто удалил. Данные из БД не удалять.
- В модели не должно быть методов с формированием разметки HTML
- Должна быть обрабатыка ошибок(try|catch) и логирование
- Интерполяция строк, использовать $@"".
// хорошо
$"добавлен 1C-пользователь {user.surname} {user.name} id:{user.id}"
// плохо
str.AppendFormat("<div class='col-lg-9 divTextBid'>{0}</div>",
myReader["countAdult"].ToString());
namespace Itrips.Models {
/// <summary>
/// Вид тура
/// </summary>
[Table("TypeTours")]
public class TypeTour {
/// <summary>
/// ID
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
/// Название
/// </summary>
public string Name { get; set; }
/// <summary>
/// Статус
/// </summary>
public bool IsActivity { get; set; } = true;
/// <summary>
/// Кто создал
/// </summary>
public Guid CreateUserID { get; set; }
/// <summary>
/// Дата создания
/// </summary>
public DateTime DateAdd { get; set; }
/// <summary>
/// Кто удалил
/// </summary>
public Guid? DeleteUserID { get; set; }
/// <summary>
/// Дата удаления
/// </summary>
public DateTime? DateDelete { get; set; }
/// <summary>
/// Удалено?
/// </summary>
[Write(false)]
public bool IsDelete => DeleteUserID != null;
/// <summary>
/// Получить Все(если передать true то только активные)
/// </summary>
/// <param name="isActivity"></param>
/// <returns></returns>
public static List<TypeTour> Get(bool isActivity = false) {
using (var connection = DBModule.NewSqlConnection())
{
return isActivity ?
connection.Query<TypeTour>("SELECT * FROM TypeTours WHERE DeleteUserID IS NULL AND IsActivity = @isActivity ORDER BY Name", new { isActivity }).ToList() :
connection.Query<TypeTour>("SELECT * FROM TypeTours WHERE DeleteUserID IS NULL ORDER BY Name").ToList();
}
}
/// <summary>
/// Получить по ID
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static TypeTour GetById(int id) {
using (var connection = DBModule.NewSqlConnection())
{
return connection.QueryFirstOrDefault<TypeTour>("SELECT * FROM TypeTours WHERE ID = @id", new { id });
}
}
/// <summary>
/// Создать
/// </summary>
/// <returns></returns>
public TypeTour Create() {
using (var connection = DBModule.NewSqlConnection())
{
DateAdd = DateTime.Now;
CreateUserID = Guid.Parse(new AuthorizationModule().getUserKod());
ID = (int)connection.Insert(this);
return this;
}
}
/// <summary>
/// Обновить
/// </summary>
/// <returns></returns>
public TypeTour Update() {
using (var connection = DBModule.NewSqlConnection())
{
connection.Update(this);
return this;
}
}
/// <summary>
/// Удалить
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static bool Delete(int id) {
var typeTour = GetById(id);
typeTour.DateDelete = DateTime.Now;
typeTour.DeleteUserID = Guid.Parse(new AuthorizationModule().getUserKod());
typeTour = typeTour.Update();
return typeTour.DateDelete != null;
}
}
}
- имя таблицы как имя класса только во множественном числе
- имена у всех полей(Pascal casing) как у класса
- тип поля должен соответствовать полю класса