powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Где и как проводить валидацию при сохранении сущности
34 сообщений из 34, показаны все 2 страниц
Где и как проводить валидацию при сохранении сущности
    #37859359
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую репозиторий на основе NHibernate
При сохранении/обновлении сущности может случиться ситуация, когда это сделать невозможно - нарушаются ограничения целостности БД. Для этого надо перед выполнением операции проверить возможность её выполнения и, в случае невозможности, выдать соответствующее исключение.
Я вижу пока только два варианта:
1. Вообще не разделять объекты BLL и DAL (что, собственно и делаю) - объект бизнес-логики будет содержать в себе и логику доступа к данным.
2. Эту задачу возложить на DAL (что опять таки косвенно сводится к варианту 1.)
Посоветуйте, пожалуйста, как лучше сделать.

Спасибо.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859371
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это в формах
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
public partial class AddEditSection : System.Web.UI.Page
    {
        int ID
        {
            get { return Request.QueryString["ID"] != null ? Convert.ToInt32(Request.QueryString["ID"]) : 0; }
        }

        Section s;
        ISectionDao sectionDao;
        protected void Page_Load(object sender, EventArgs e)
        {
            IDaoFactory daoFactory = new NHibernateDaoFactory();
            sectionDao = daoFactory.GetSectionDao();
            
            if (ID == 0)
                s = new Section();
            else
            {
                s = sectionDao.GetById(ID, false);

                if (IsPostBack)
                    return;

                TextBoxName.Text = s.Name;
                TextBoxOrd.Text = s.Ord.ToString();
               
            }
        }

        protected void LinkButtonSave_Click(object sender, EventArgs e)
        {
           
            try
            {
                s.Name = TextBoxName.Text;
                s.Ord = Convert.ToInt32(TextBoxOrd.Text);
                s.User = (UserProfile)Session["UserProfile"];
                              
                sectionDao.SaveOrUpdate(s);

            }
            catch (Exception ex)
            {
                LabelError.Text = ex.Message;
            }
        }

        protected void LinkButtonCancel_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default.aspx");
        }
    }



пихать логику проверки сюда?
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859374
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawПри сохранении/обновлении сущности может случиться ситуация, когда это сделать невозможно - нарушаются ограничения целостности БДНу и хорошо. Они там для того и есть. Зачем их дублировать?
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859375
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, да, забыл сказать - скачал пример для работы - типа "фен-шуй" - на основе него и тренируюсь

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
/// <summary>
        /// For entities with automatatically generated IDs, such as identity, SaveOrUpdate may 
        /// be called when saving a new entity.  SaveOrUpdate can also be called to update any 
        /// entity, even if its ID is assigned.
        /// </summary>
        public T SaveOrUpdate(T entity) {
            NHibernateSession.SaveOrUpdate(entity);
            return entity;
        }



сюда логику проверки (после перегрузки) воткнуть? то же не камильфо
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859377
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

чтобы обработать ситуацию их нарушения и правильно сформировать дальнейшие действия в программе. ОРМ юзаю
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859384
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
protected void btnAdd_OnClick(object sender, EventArgs e)
        {
            if (txtCustomerID.Text.Trim().Length == 5)
            {
                Customer newCustomer = new Customer(txtCompanyName.Text);
                newCustomer.SetAssignedIdTo(txtCustomerID.Text);
                newCustomer.ContactName = txtContactName.Text;

                IDaoFactory daoFactory = new NHibernateDaoFactory();
                ICustomerDao customerDao = daoFactory.GetCustomerDao();

                if (!IsDuplicateOfExisting(newCustomer, customerDao))
                {
                    customerDao.Save(newCustomer);
                    Response.Redirect("ListCustomers.aspx?action=added");
                }
                else
                {
                    lblMessage.Text =
                        "<span style=\"color:red\">The ID you provided is already in use.</span>
Please change the ID and try again.";
                }
            }
            else
            {
                lblMessage.Text =
                    "<span style=\"color:red\">The ID you provide must be exactly 5 characters long.</span>
Please change the ID and try again.";
            }
        }



так было в примере. Но это происходит на уровне UI. что я в ступоре...
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859386
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на уровне UI хотелось бы поймаль соответствующий эксепшн - и все, этим UI и ограничить
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859422
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public class Section : DomainObject<int>
    {
        
        public DateTime? DateInsert { get; set; }
        public DateTime? DateUpdate { get; set; }
        public int Ord { get; set; }

        string name;
        public string Name
        {
            get { return name; }
            set
            {
                Check.Require(!string.IsNullOrEmpty(value), "Наименование не должно быть пустым");
                name = value;
            }
        }

               
        public override int GetHashCode()
        {
            return (GetType().FullName + "|" +
                    Name + "|" +
                    Ord).GetHashCode();
        }

        public UserProfile User { get; set; }
        public IList<Test> Tests { get; set; }
    }



вот так выглядит бизнес-объект. такой чистый... жалко его скрещивать с объектом достпа к данным
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859424
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я на шаг от разочарования в DDD вот тут смомневался
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859426
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя это все может и не в тему - ну реально не знаю что делать!
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859620
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawна уровне UI хотелось бы поймаль соответствующий эксепшн - и все, этим UI и ограничитьНу и лови эксепшен от ограничений целостности в БД. В чём проблема-то?
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37859969
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmaw,

Пример валидации . Сам не смотрел, но авторы хороши, лажи не делают.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861140
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

спасибо за пример. я его пока не вкурил - сложно - пример использования этой библиотеки на MVC - а у меня VS2008 без оного.

но суть вопроса была в том, что я думаю, где именно размещать логику валидации, связанную с ограничениями БД, которая будет ВСЕ знать о прикладном характере этих ограничений. Если ловить исключение, типа "Невозможно вставить NULL", "Сработал констрейн", "Нарушение уникальности" и т.п., то их потом надо будет "расшифорвывать".

Пока решил сделать так - за операции отвечает "контроллер" (WebForms) - некоторая прослойка между UI и репозиторием, которая имеет ссылки на репозиторий и бизнес-объект. Вроде все складно получается:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public partial class AddEditSection : System.Web.UI.Page
    {
        int id
        {
            get { return Request.QueryString["ID"] != null ? Convert.ToInt32(Request.QueryString["ID"]) : 0; }
        }

        SectionController controller = new SectionController();
        protected void Page_Load(object sender, EventArgs e)
        {
            controller.SetEntityInstance(id, (UserProfile)Session["UserProfile"]);

            if (IsPostBack)
                return;

            TextBoxName.Text = controller.Section.Name;
            TextBoxOrd.Text = controller.Section.Ord.ToString();
        }

        protected void LinkButtonSave_Click(object sender, EventArgs e)
        {
            LabelError.Text = "";
            try
            {
                controller.Section.Name = TextBoxName.Text;
                controller.Section.Ord = Convert.ToInt32(TextBoxOrd.Text);
                controller.Section.User = (UserProfile)Session["UserProfile"];

                controller.SaveOrUpdate();
            }
            catch (Exception ex)
            {
                LabelError.Text = ex.Message;
            }
            
        }

        protected void LinkButtonCancel_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default.aspx");
        }
    }



сомнения есть, однако, в правильности
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861154
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawЕсли ловить исключение, типа "Невозможно вставить NULL", "Сработал констрейн", "Нарушение уникальности" и т.п., то их потом надо будет "расшифорвывать".Тебе не кажется, что проще извлечь из текста сообщения прикладной смысл банальным поиском подстроки с названием ограничения, чем городить слой проверок, дублирующих ограничения с СУБД?

Код: c#
1.
2.
if (e.Message.Contains("IX_MY_UNIQUE_INDEX"))
    throw new MyDataValidationException("Такое уже есть, до свидания.", e)
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861162
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

я рассматривал этот вариант. но в каком месте производить анализ строки сообщения (или тип ексепшна)? UI - не вариант. Репозиторий - тоже. Так вроде и остается только этот мой контроллер. Но я думаю не парсить строки сообщений - а предварительно проверять возможность сохранения
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861165
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawАлексей К,

я рассматривал этот вариант. но в каком месте производить анализ строки сообщения (или тип ексепшна)? UI - не вариант. Репозиторий - тоже. Так вроде и остается только этот мой контроллер.Организуй централизованную обработку неперехваченных исключений. Анализируй, преобразуй и пиши в лог.

зы: Сообщения на экране можно рассматривать как одну из разновидностей лога.
kmawНо я думаю не парсить строки сообщений - а предварительно проверять возможность сохраненияЕсли не лень заниматься двойной работой - в добрый путь.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861166
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
2.
if (e.Message.Contains("IX_MY_UNIQUE_INDEX"))
    



это совсем жестко
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861171
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawАлексей К
Код: c#
1.
if (e.Message.Contains("IX_MY_UNIQUE_INDEX"))

это совсем жесткоЯ бы сказал, дёшего и сердито. Главное, давать констреинтам/индексам в БД уникальные и осмысленные названия.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861172
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не лень - главное чтобы это было системно. а разбор строк - это хардкорно
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861176
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawне лень - главное чтобы это было системно. а разбор строк - это хардкорноЭто просто громкие слова, пока не сформулируеш, хотябы для себя, конкретные проблемы, которые могут возникнуть при этом подходе.

Если считаеш, что простой поиск подстроки недостаточно надёжен - делай более сложный разбор, можно с применением регулярок. Но я считаю это лишним.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861177
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к тому же и триггер может сработать - который N-условий проверяет - тоже ексепшн - тут с разбором строк совсем грустно получится
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861179
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и в конце-концов - не все ограничения могут быть в БД реализованы, те же триггеры отсутствовать, например - разные люди делают
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861181
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawк тому же и триггер может сработать - который N-условий проверяет - тоже ексепшн - тут с разбором строк совсем грустно получитсяСообщения в триггере могут быть для этого оформлены специальным образом и формироваться специально обученной для этого хранимой процедурой. Например:

Код: c#
1.
2.
if (e.Message.StartsWith("INF"))
    throw new MyDataValidationException(e.Message.SubString(3), e);



Можно задействовать пользовательские коды ошибок. Тут всё зависит от используемой СУБД и желания.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861182
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawда и в конце-концов - не все ограничения могут быть в БД реализованыНу ты же спросил как быть с именно ограничениями в БД. Пусть помимо БД тоже будет логика. Я не против. :-)
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861192
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПусть помимо БД тоже будет логика

Куда её воткнуть - вот в чем вопрос
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861199
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawАлексей КПусть помимо БД тоже будет логикаКуда её воткнуть - вот в чем вопросТрадиционно, делаеш слой бизнес-логики. В нём всё реализуеш.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// Бизнес объект, может быть кодогенерированным, в зависимости от
// используемых средств
class MyEntity 
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }
    public int Value3 { get; set; }
}

class MyDataService
{
    // "это" вызываеш из LinkButtonSave_Click
    public void Save(MyEntity obj)
    {
        // тут валидация
        // тут сохранение в БД
    }
}
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861203
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСообщения в триггере могут быть для этого оформлены специальным образом и формироваться специально обученной для этого хранимой процедурой.

это жесткая связь приложения с СУБД - причем на уровне соглашений между разработчиками/ом_с_самими_собой

Алексей К
Код: c#
1.
2.
if (e.Message.StartsWith("INF"))
    throw new MyDataValidationException(e.Message.SubString(3), e);




хардкор - и не дешевый, и не сердитый

Алексей КМожно задействовать пользовательские коды ошибок. Тут всё зависит от используемой СУБД и желания.

тоже хардкор
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861207
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кkmawпропущено...
Куда её воткнуть - вот в чем вопросТрадиционно, делаеш слой бизнес-логики. В нём всё реализуеш.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// Бизнес объект, может быть кодогенерированным, в зависимости от
// используемых средств
class MyEntity 
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }
    public int Value3 { get; set; }
}

class MyDataService
{
    // "это" вызываеш из LinkButtonSave_Click
    public void Save(MyEntity obj)
    {
        // тут валидация
        // тут сохранение в БД
    }
}



так это и получается тем, что я назвал выше контроллер
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861213
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
public class SectionController
    {
        public Section Section { get; set; }

        ISectionDao sectionDao;

        public void SetInstance(int id, UserProfile up)
        {
            IDaoFactory daoFactory = new NHibernateDaoFactory();
            sectionDao = daoFactory.GetSectionDao();

            if (id == 0)
                Section = new Section();
            else
            {
                Section = sectionDao.GetById(id, false);
                
            }
            Section.User = up;
        }

        public void SaveOrUpdate()
        {
            NHibernateSessionManager.Instance.BeginTransaction();
            try
            {
                
                if (sectionDao.GetUniqueByExample("Name", Section.Name, Section.ID)!= null)
                    throw new PostconditionException(String.Format("Раздел с наименованием [{0}] уже существует", Section.Name));
                
                sectionDao.SaveOrUpdate(Section);
                NHibernateSessionManager.Instance.CommitTransaction();
            }
            catch
            {

                NHibernateSessionManager.Instance.RollbackTransaction();
                NHibernateSessionManager.Instance.CloseSession();

                throw;
            }

        }
    }



как-то вот так пока сделал
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861216
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawАлексей КПусть помимо БД тоже будет логика

Куда её воткнуть - вот в чем вопрос

Прежде, чем велосипеды придумывать, посмотрели бы, что другие делают. Нормальная система валидации за 6сек не рисуется
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861223
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVakmawпропущено...


Куда её воткнуть - вот в чем вопрос

Прежде, чем велосипеды придумывать, посмотрели бы, что другие делают. Нормальная система валидации за 6сек не рисуется

очень "конструктивно"
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861225
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawАлексей КСообщения в триггере могут быть для этого оформлены специальным образом и формироваться специально обученной для этого хранимой процедурой.

это жесткая связь приложения с СУБД - причем на уровне соглашений между разработчиками/ом_с_самими_собой

Алексей К
Код: c#
1.
2.
if (e.Message.StartsWith("INF"))
    throw new MyDataValidationException(e.Message.SubString(3), e);




хардкор - и не дешевый, и не сердитый

Алексей КМожно задействовать пользовательские коды ошибок. Тут всё зависит от используемой СУБД и желания.

тоже хардкорЯ же тебе говорю, это просто громкие слова. Попробуй конкретно сформулировать проблемы, возникающие при этом подходе.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861227
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmawэто жесткая связь приложения с СУБД - причем на уровне соглашений между разработчиками/ом_с_самими_собойКакой бы ни был разработчик, всегда можно распарсить исключение, генерируемое СУБД. Я лиш показал один из возможных вариантов.
...
Рейтинг: 0 / 0
Где и как проводить валидацию при сохранении сущности
    #37861230
kmaw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, мы уже по кругу ходим в наших вопрос-ответ
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Где и как проводить валидацию при сохранении сущности
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]