Привет, уважаемый all!
Тема достаточно избита, но по поисковым словам мне не удалось найти нужный тред.
В моем приложении реализованы уровни UI, BL, DAL. Последний предоставляет в первую очередь доступ как напрямую к таблицам, так и к сущностям, которые м.б. реализованы в нескольких таблицах. Для работы со сложными сущностями требуется, ессно, проводить все операции в рамках одной транзакции.
Например, есть сущность "Контакт" (Contact(ID, Data, ...)) и есть сущность "Контакт персоны", реализованная в таблицах Contact и таблице-связке UserContact(ID, UserID, ...)).
При модификации этой сущности изменения должны вноситься в обе таблицы сразу, т.к. юзер мог изменить как данные самого контакта, так и привязку его к юзеру.
Теперь вопросы.
1. На каком уровне приложения должны исчезнуть таблицы и остаться только сущности? Мой DAL умеет делать примитивные операции на уровне таблиц (через БД-шный процедурный интерфейс):
Contact_Ins, Contact_Upd, Contact_Del;
UserContact_Ins, UserContact_Upd, UserContact_Del;
но при этом содержит расширенный механизм, позволяющий изменять не только таблицы, но и сущности:
UserContactExt_Ins, UserContactExt_Upd, UserContactExt_Del, внутри которых происходит вызов примитивных операций выше.
Это - нормальная практика? Или механизм для работы с сущностью стоит запихать в БД?
2. Транзакционность.
В своем варианте я предполагаю, что транзакции буду делать в слое DAL, то есть, для примера выше будет происходить так:
public static void Delete(...)
{
SqlConnection conn = new SqlConnection("blablabla");
SqlTransaction tran = conn.BeginTransaction();
// delete UserContact
UserContactDAL.Delete(conn, ...);
// delete Contact
ContactDAL.Delete(conn, ...);
tran.Commit;
conn.Close();
}
В примере нет обработки исключений, но смысл понятен.
Стоит ли поступать таким образом или операции над сущностями и их транзакционность запихать в БД?
Буду признателен за другие советы.
Спасибо.