{"id":282664,"date":"2016-12-18T14:55:03","date_gmt":"2016-12-18T11:55:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=282664"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=282664","title":{"rendered":"\u0413\u043e\u0442\u043e\u0432\u0438\u043c ORM \u043d\u0435 \u043e\u0442\u0445\u043e\u0434\u044f \u043e\u0442 \u043f\u043b\u0438\u0442\u044b"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/ic.pics.livejournal.com\/gubarevan\/50612969\/883210\/883210_original.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u043e\u043c \u043a <s>\u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0438\u0437\u043c\u0443<\/s> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043e\u0432. \u0426\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0437\u044b\u0431\u043a\u043e\u0439 \u0442\u0435\u043c\u044b \u043a\u0430\u043a ORM. <br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u0441\u0435?<\/h3>\n<p>  \u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a MS Entity Framework, NHibernate \u0441\u043b\u043e\u0436\u043d\u044b, \u0438\u043c\u0435\u044e\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0449\u044c \u0432 \u0441\u0435\u0431\u0435. \u0427\u0430\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0442 \u0442\u0430\u043a\u0438\u0445 ORM, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. <\/p>\n<p>  \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u043e\u0441\u0442\u0430 \u2014 <a href=\"http:\/\/www.books.ru\/books\/arkhitektura-korporativnykh-programmnykh-prilozhenii-156126\/\">\u043a\u043d\u0438\u0433\u0430 \u041c\u0430\u0440\u0442\u0438\u043d\u0430 \u0424\u0430\u0443\u043b\u0435\u0440\u0430 \u00abPatterns of Enterprise Application Architecture (P of EAA)\u00bb<\/a>.<\/p>\n<p>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0443\u0447\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e ORM, DDD, TTD, <s>\u0413\u0418\u0411\u0414\u0414<\/s> \u2014 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043c\u043e\u044f \u0446\u0435\u043b\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u043d\u0446\u0435 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 git hub.<br \/>  <cut\/>  <\/p>\n<h3>\u0427\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c?<\/h3>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438: \u043f\u043e\u0434 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f<br \/>  \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0431\u0434. <\/p>\n<p>  <i>\u041a\u0430\u043a\u0438\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b ORM?<\/i><\/p>\n<ul>\n<li>\u041f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0432 .NET \u043c\u0438\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 ORM: \u0441 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0431\u0435\u0437 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/li>\n<li>\u041a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 sql-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432: \u0441 \u044f\u0432\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/li>\n<\/ul>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0440\u0435\u0434\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 ORM \u0431\u0435\u0437 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0438 \u0441 \u044f\u0432\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0441\u0430\u043c\u044b\u0439 \u044f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <a href=\"https:\/\/habrahabr.ru\/post\/116862\/\">Dapper ORM \u043e\u0442 Stack Overflow<\/a>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0442\u0430\u043a\u0438\u0445 ORM \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0435 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0434 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0431\u0434.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 MS Entity Framework \u0438 NHibernate \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041d\u0435 \u0431\u0443\u0434\u0443 \u0442\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u0412\u0441\u0435 \u0439\u043e\u0433\u0443\u0440\u0442\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0438 \u0438\u0441\u0442\u0438\u043d\u0430 \u0432 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>  \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a (\u0442\u043e \u0435\u0441\u0442\u044c \u044f) \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c ORM \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 (\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f) \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c sql-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0437 \u043b\u044f\u043c\u0431\u0434\u0430 \u2014 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u044f\u0437\u044b\u043a\u0430 C#, \u0441 \u043d\u0443\u043b\u044f, \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f Linq2Sql, LinqToEntities (\u0434\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0440!).<\/p>\n<p>  \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u0432 MS Entity Framework \u0435\u0441\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c, \u0434\u0430\u043d\u043d\u044b\u0445: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u0431\u0434, \u0434\u0430\u043b\u0435\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\\\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a \u0431\u0434. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0431\u0434, \u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 <a href=\"https:\/\/habrahabr.ru\/post\/203214\/\">\u0442\u0443\u0442<\/a>. \u0420\u0435\u0448\u0438\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0438\u043d\u0433\u0440\u0435\u0434\u0438\u0435\u043d\u0442\u0430\u043c\u0438<\/h3>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439. \u0412\u044b\u0434\u0435\u043b\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b ORM \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<br \/>  \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 ORM \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0438\u0434\u0435\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e <a href=\"https:\/\/habrahabr.ru\/post\/263033\/\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/a> \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c ORM. <\/p>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0438\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public abstract class Repository&lt;T&gt; : IRepository&lt;T&gt;  where T : EntityBase,new()     {     \/\/\u041f\u043e\u0437\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b     } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"cs\">\/\/\u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430  public abstract class EntityBase : IEntity     { \/\/\u0432 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440         public abstract int Id { get; set; }         public object Clone()         {             return MemberwiseClone();         }     }<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 Clone() \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u0440\u0438 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0435, \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435.  <\/div>\n<\/div>\n<p>  \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u2014 \u043a\u043b\u0430\u0441\u0441 Profile. <\/p>\n<p>  <i>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 ORM \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0442\u0440\u0438 \u0448\u0430\u0433\u0430:<\/i><\/p>\n<ol>\n<li>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 Profile<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">           \/\/\u0412\u0441\u0435 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0430 EntityBase \t    [TableName(&quot;profile&quot;)] \t   public class Profile : EntityBase \t    { \t\/\/\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432 \u0431\u0434 \t        [FieldName(&quot;profile_id&quot;)] \t        public override int Id { get; } \t        [FieldName(&quot;userinfo_id&quot;)] \t        public int? UserInfoId { get; set; } \t        [FieldName(&quot;role_id&quot;)] \t        public int RoleId { get; set; } \t        public string Info { get; set; } \t    } \t<\/code><\/pre>\n<p>   <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    public class ProfileRepository : Repository&lt;Profile&gt;     { \/\/\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f         public ProfileRepository()             : base(&quot;PhotoGallery&quot;)         {        \/\/\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 CRUD \u043c\u0435\u0442\u043e\u0434\u043e\u0432          }     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0434\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">&lt;connectionStrings&gt;     &lt;add name=&quot;PhotoGallery&quot; providerName=&quot;System.Data.SqlClient&quot; connectionString=&quot;server=PC\\SQLEXPRESS; database=db_PhotoGallery&quot;\/&gt;   &lt;\/connectionStrings&gt;<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<\/li>\n<\/ol>\n<p>  \u0414\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d UnitOfWork. \u0421\u0443\u0442\u044c UnitOfWork \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043d\u0430\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0434\u043e\u043c\u0435\u043d\u0430, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 \u0432\u0441\u0435 \u0438 \u0441\u0440\u0430\u0437\u0443.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c UnitOfWork<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    public interface IUnitOfWork : IDisposable     {         void Commit();     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435. \u041d\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\u0422\u0440\u0435\u043a\u0438\u043d\u0433 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0431\u0438\u0437\u043d\u0435\u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <\/li>\n<li> \u0411\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e\u0442\u043e\u043a\u0430<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0443\u0436\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u043e\u0431\u044a\u0435\u043a\u0442 UnitOfWork, \u0442\u043e \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u0435\u0430\u043d\u0441\u0443.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c Session<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    public static class Session     {         \/\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e\u0442\u043e\u043a\u0430         private static readonly ThreadLocal&lt;IUnitOfWork&gt; CurrentThreadData =          new ThreadLocal&lt;IUnitOfWork&gt;(true);         public static IUnitOfWork Current         {             get { return CurrentThreadData.Value; }             private set { CurrentThreadData.Value = value; }         }         public static IUnitOfWork Create(IUnitOfWork uow)         {             return Current ?? (Current = uow);         }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430, \u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 UnitOfWork \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0440\u043e\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c Session.Create.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 ORM, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ORM.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ORM<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">            var uow = new UnitOfWork();             using (Session.Create(uow))             {                 var profileRepo = new ProfileRepository();                 \/\/\u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f                 uow.Commit();            }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <cut\/>  <\/p>\n<h3>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0433\u043e\u0442\u043e\u0432\u043a\u0435<\/h3>\n<p>  \u0412\u0441\u0435 \u043e \u0447\u0435\u043c \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u043a\u0430\u0441\u0430\u043b\u043e\u0441\u044c public \u0447\u0430\u0441\u0442\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c internal \u0447\u0430\u0441\u0442\u044c. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430. <\/p>\n<p>  \u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0443\u0442\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430:<\/p>\n<ul>\n<li>\u0411\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0442\u0438\u043f, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0442\u0440\u0435\u043a\u0438\u043d\u0433 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u043d\u0430\u0434 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/li>\n<li>\u0422\u0440\u0435\u043a\u0438\u043d\u0433 \u043e\u0431\u044a\u0435\u043a\u0442 \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0441\u0440\u0435\u0434\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0435\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  \u0418\u0437 \u0447\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0438\u043f\u0430<\/li>\n<li>\u041d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c<\/li>\n<\/ul>\n<p>  \u041f\u043e \u0441\u0443\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <u>\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c<\/u> \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041a\u0430\u043a \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u0432\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043a\u0430\u043c\u0438 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0430 EntityBase \u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0442\u0438\u043f\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0431\u0434. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    internal struct EntityStruct     {        \/\/\u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430         internal Type Key { get; private set; }         internal EntityBase Value { get; private set; }         internal EntityStruct(Type key, EntityBase value)             : this()         {             Key = key;             Value = value;         }         public override bool Equals(object obj)         {             return obj.GetHashCode() == GetHashCode();         }         public bool Equals(EntityBase obj)         {             return Equals(obj);         }         public override int GetHashCode()         { \/\/\u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0431\u0434, \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0435\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c             var code = Key.GetHashCode() + Value.Id.GetHashCode();             \/\/\u0445\u044d\u0448 \u043a\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c             return code &gt; 0 ? code : (-1) * code;         }     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h4>\u0422\u0440\u0435\u043a\u0438\u043d\u0433 \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/h4>\n<p>  \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. <\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u0431\u0434, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430.<br \/>  \u0422\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u0434\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u0434 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f, \u0434\u043e \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u0442\u044b\u043c\u0438\u00bb, \u0432\u0442\u043e\u0440\u044b\u0445 \u00ab\u0433\u0440\u044f\u0437\u043d\u044b\u043c\u0438\u00bb \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">           var uow = new UnitOfWork();             using (Session.Create(uow))             {                 var profileRepo = new ProfileRepository();             \/\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c &quot;\u0447\u0438\u0441\u0442\u044b\u0435&quot; \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0443\u0442\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0434,             \/\/\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c &quot;\u0433\u0440\u044f\u0437\u043d\u044b\u043c\u0438&quot;                 var profiles = profileRepo.Get(x=&gt;x.Info = &quot;\u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u044e\u0437\u0435\u0440&quot;);                 \/\/\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c &quot;\u0433\u0440\u044f\u0437\u043d\u044b\u0435&quot; \u043e\u0431\u044a\u0435\u043a\u0442\u044b                 foreach (var profile in profiles)                 {                     profile.Info = &quot;\u041f\u043b\u043e\u0445\u043e\u0439 \u044e\u0437\u0435\u0440&quot;;                 }                \/\/\u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439                 uow.Commit();            }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u00ab\u0447\u0438\u0441\u0442\u044b\u0445\u00bb \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0433\u0443\u0431\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u0432\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<p>  \u041d\u0443\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e (\u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b EntityStruct \u0441 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c Equals). \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0430 \u043a \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0438\u0445 \u0445\u044d\u0448\u0435\u0439. <\/p>\n<p>  \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 \u0435\u0433\u043e CRUD \u043c\u0435\u0442\u043e\u0434\u0430\u0445.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    internal interface IObjectTracker     { \/\/\u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u0438 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432         ICollection&lt;EntityStruct&gt; NewObjects { get; }         ICollection&lt;EntityStruct&gt; ChangeObjects { get; }         \/\/\u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438          void RegInsertedNewObjects(object sender, AddObjInfoEventArgs e);         void RegCleanObjects(object sender, DirtyObjsInfoEventArgs e);     }     internal class DefaultObjectTracker : IObjectTracker     {         \/\/\u043a\u043b\u044e\u0447 \u0441\u043b\u043e\u0432\u0430\u0440\u044f - &quot;\u0433\u0440\u044f\u0437\u043d\u044b\u0439&quot; \u043e\u0431\u044a\u0435\u043a\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - &quot;\u0447\u0438\u0441\u0442\u044b\u0439&quot; \u043e\u0431\u044a\u0435\u043a\u0442         private readonly Dictionary&lt;EntityStruct, EntityStruct&gt; _dirtyCreanPairs;         public ICollection&lt;EntityStruct&gt; NewObjects { get; private set; }         public ICollection&lt;EntityStruct&gt; ChangeObjects         {             get             {                \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b                 return _dirtyCreanPairs.GetChangesObjects();             }         }         internal DefaultObjectTracker()         {             NewObjects = new Collection&lt;EntityStruct&gt;();   \/\/\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 boxing\/unboxing \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0432\u043e\u0439 EqualityComparer             _dirtyCreanPairs =            new Dictionary&lt;EntityStruct, EntityStruct&gt;(new IdentityMapEqualityComparer());         }         public void RegInsertedNewObjects(object sender, AddObjInfoEventArgs e)         {             NewObjects.Add(e.InsertedObj);         }         public void RegCleanObjects(object sender, DirtyObjsInfoEventArgs e)         {             var objs = e.DirtyObjs;             foreach (var obj in objs)             {                 if (!_dirtyCreanPairs.ContainsKey(obj))                 {   \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c &quot;\u0447\u0438\u0441\u0442\u044b\u0439&quot; \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0443\u0442\u0435\u043c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 MemberwiseClone()                     var cloneObj = new EntityStruct(obj.Key, (EntityBase)obj.Value.Clone());                     _dirtyCreanPairs.Add(obj, cloneObj);                 }             }         }       }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">        public static ICollection&lt;EntityStruct&gt; GetChangesObjects         (          this Dictionary&lt;EntityStruct, EntityStruct&gt; dirtyCleanPairs         )         {             var result = new List&lt;EntityStruct&gt;();             foreach (var cleanObj in dirtyCleanPairs.Keys)             {                 if (!(cleanObj.Key == dirtyCleanPairs[cleanObj].Key))                 {                     throw new Exception(&quot;incorrect types&quot;);                 }                 if (ChangeDirtyObjs(cleanObj.Value, dirtyCleanPairs[cleanObj].Value, cleanObj.Key))                 {                     result.Add(cleanObj);                 }             }             return result;         }         public static bool ChangeDirtyObjs(EntityBase cleanObj, EntityBase dirtyObj, Type type)         {             var props = type.GetProperties();            \/\/\u0446\u0438\u043a\u043b \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430             foreach (var prop in props)             {                 var cleanValue = prop.GetValue(cleanObj, null);                 var dirtyValue = prop.GetValue(dirtyObj, null);               \/\/\u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438                 if (!cleanValue.Equals(dirtyValue))                 {                     return true;                 }             }             return false;         }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0434. \u041b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0441\u0432\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 (\u043a\u043b\u0430\u0441\u0441\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e IObjectTracker, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 DefaultObjectTracker). <\/p>\n<p>  \u0422\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u00ab\u0437\u043d\u0430\u0442\u044c\u00bb \u0438\u0437 \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445 \u0431\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0442\u0440\u0435\u043a\u0438\u043d\u0433. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 UnitOfWork, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 (\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 DefaultObjectTracker) \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c \u043a \u0431\u0434 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0437\u043c\u0435\u043d\u0438\u043c \u043a\u043b\u0430\u0441\u0441 UnitOfWork&#39;\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    internal interface IDetector     {       \/\/\u043a\u043b\u044e\u0447 \u0441\u043b\u043e\u0432\u0430 - \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0443, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430         Dictionary&lt;string, IObjectTracker&gt; ObjectDetector { get; }     }      public sealed class UnitOfWork : IUnitOfWork, IDetector     {         private readonly Dictionary&lt;string, IObjectTracker&gt; _objectDetector;         Dictionary&lt;string, IObjectTracker&gt; IDetector.ObjectDetector         {             get { return _objectDetector; }         }         public UnitOfWork()         {             _objectDetector = new Dictionary&lt;string, IObjectTracker&gt;();             foreach (ConnectionStringSettings conName in ConfigurationManager.ConnectionStrings)             {              \/\/\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u043a \u0431\u0430\u0437\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430                 _objectDetector.Add(conName.Name, new DefaultObjectTracker());             }         } }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u0437\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u0441\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u0423\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 Session.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 Session \u043f\u0440\u0438\u043c\u0435\u0442 \u0432\u0438\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    public static class Session     {         private static readonly ThreadLocal&lt;IUnitOfWork&gt; CurrentThreadData = new ThreadLocal&lt;IUnitOfWork&gt;(true);         public static IUnitOfWork Current         {             get { return CurrentThreadData.Value; }             private set { CurrentThreadData.Value = value; }         }         public static IUnitOfWork Create(IUnitOfWork uow)         {             return Current ?? (Current = uow);         }         \/\/\u041c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043b\u044f\u0440 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438         \/\/ \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f         internal static IObjectTracker GetObjectTracker(string connectionName)         {             var uow = Current;             if (uow == null)             {                 throw new ApplicationException(&quot; Create unit of work context and using Session.&quot;);             }             var detector = uow as IDetector;             if (detector == null)             {                 throw new ApplicationException(&quot;Create unit of work context and using Session.&quot;);             }             return detector.ObjectDetector[connectionName];         }     } }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h4>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c<\/h4>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0434. \u042d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 \u0435\u0433\u043e CRUD \u043c\u0435\u0442\u043e\u0434\u0430\u0445. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f CRUD \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 DbProvider<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    internal interface IDataSourceProvider : IDisposable     {         State State { get; }          \/\/\u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0431\u0434, \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432          void Commit(ICollection&lt;EntityStruct&gt; updObjs);         ICollection&lt;T&gt; GetByFields&lt;T&gt;(BinaryExpression exp) where T : EntityBase, new();       }     internal class DbProvider : IDataSourceProvider     {         private IDbConnection _connection;         internal DbProvider(IDbConnection connection)         {             _connection = connection;             State = State.Open;         }         public State State { get; private set; }         public ICollection&lt;T&gt; GetByFields&lt;T&gt;(BinaryExpression exp) where T : EntityBase, new()         {             \/\/ \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 select-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e exp             Func&lt;IDbCommand, BinaryExpression, string&gt; cmdBuilder =                                 SelectCommandBulder.Create&lt;T&gt;;             ICollection&lt;T&gt; result;             using (var conn = _connection)             {                 using (var command = conn.CreateCommand())                 {                     command.CommandText = cmdBuilder.Invoke(command, exp);                     command.CommandType = CommandType.Text;                     conn.Open();                     result = command.ExecuteListReader&lt;T&gt;();                 }             }             State = State.Close;             return result;         }        public void Commit(ICollection&lt;EntityStruct&gt; updObjs)         {             if (updObjs.Count == 0)             {                 return;             }               \/\/ \u043a\u043b\u044e\u0447 - \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 update-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e exp               \/\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b             var cmdBuilder = new Dictionary&lt;Func&lt;IDbCommand, ICollection&lt;EntityStruct&gt;, string&gt;, ICollection&lt;EntityStruct&gt;&gt;();             cmdBuilder.Add(UpdateCommandBuilder.Create, updObjs);             ExecuteNonQuery(cmdBuilder, packUpdDict, packDeleteDict);         }          private void ExecuteNonQuery(Dictionary&lt;Func&lt;IDbCommand, ICollection&lt;EntityStruct&gt;, string&gt;, ICollection&lt;EntityStruct&gt;&gt; cmdBuilder)         {             using (var conn = _connection)             {                 using (var command = conn.CreateCommand())                 {                     var cmdTxtBuilder = new StringBuilder();                     foreach (var builder in cmdBuilder)                     {                         cmdTxtBuilder.Append(builder.Key.Invoke(command, builder.Value));                     }                     command.CommandText = cmdTxtBuilder.ToString();                     command.CommandType = CommandType.Text;                     conn.Open();                     if (command.ExecuteNonQuery() &lt; 1)                         throw new ExecuteQueryException(command);                 }             }             State = State.Close;         }         private ICollection&lt;T&gt; ExecuteListReader&lt;T&gt;(EntityStruct objs)         where T : EntityBase, IEntity, new()         {             Func&lt;IDbCommand, EntityStruct, string&gt; cmdBuilder = SelectCommandBulder.Create;             ICollection&lt;T&gt; result;             using (var conn = _connection)             {                 using (var command = conn.CreateCommand())                 {                     command.CommandText = cmdBuilder.Invoke(command, objs);                     command.CommandType = CommandType.Text;                     conn.Open();                     result = command.ExecuteListReader&lt;T&gt;();                 }             }             State = State.Close;             return result;         }         private void Dispose()         {             if (State == State.Open)             {                 _connection.Close();                 State = State.Close;             }             _connection = null;             GC.SuppressFinalize(this);         }         void IDisposable.Dispose()         {             Dispose();         }         ~DbProvider()         {             Dispose();         }     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043b\u0430\u0441\u0441\u0443 DbProvider \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0434. \u0414\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430 DbProvider \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0444\u0430\u0431\u0440\u0438\u043a\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 DbProvider&#39;\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    class DataSourceProviderFactory     {         static DbConnection CreateDbConnection(string connectionString, string providerName)         {             if (string.IsNullOrWhiteSpace(connectionString))             {                 throw new ArgumentException(&quot;connectionString is null or whitespace&quot;);             }             DbConnection connection;             DbProviderFactory factory;             try             {                 factory = DbProviderFactories.GetFactory(providerName);                 connection = factory.CreateConnection();                 if (connection != null) connection.ConnectionString = connectionString;             }             catch (ArgumentException)             {                 try                 {                     factory = DbProviderFactories.GetFactory(&quot;System.Data.SqlClient&quot;);                     connection = factory.CreateConnection();                     if (connection != null)                     {                         connection.ConnectionString = connectionString;                     }                 }                 catch (Exception)                 {                     throw new Exception(&quot;DB connection has been failed.&quot;);                 }             }             return connection;         }         public static IDataSourceProvider Create(string connectionString)         {             var settings = ConfigurationManager.ConnectionStrings[connectionString];              var dbConn = CreateDbConnection(settings.ConnectionString, settings.ProviderName);             return new DbProvider(dbConn);         }         public static IDataSourceProvider CreateByDefaultDataProvider(string connectionString)         {             var dbConn = CreateDbConnection(connectionString, string.Empty);             return new DbProvider(dbConn);         }     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 CRUD \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0442\u043e\u0442 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u043b\u043e\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IDataSourceProvider \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IDataSourceProvider \u0434\u043e\u043b\u0436\u043d\u0430 \u00ab\u0443\u043c\u0435\u0442\u044c\u00bb \u043a\u0430\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0440\u0435\u043a\u0438\u043d\u0433, \u0442\u0430\u043a \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0431\u0434. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 DbProvider.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 TrackerProvider<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    internal class TrackerProvider : IDataSourceProvider     {         private event EventHandler&lt;DirtyObjsInfoEventArgs&gt; DirtyObjEvent;         private event EventHandler&lt;UpdateObjsInfoEventArgs&gt; UpdateObjEvent;         private readonly IDataSourceProvider _dataSourceProvider;         private readonly string _connectionName;         private readonly object _syncObj = new object();         private IObjectTracker ObjectTracker         {             get             {                 lock (_syncObj)                 {                    \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430                     return Session.GetObjectTracker(_connectionName);                 }             }         }         public TrackerProvider(string connectionName)         {             _connectionName = connectionName;             _dataSourceProvider = DataSourceProviderFactory.Create(_connectionName);            \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430             RegisterEvents();         }         public State State         {             get             {                 return _dataSourceProvider.State;             }         }         private void RegisterEvents()         {            \/\/\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430             if (Session.Current == null)             {                 throw new ApplicationException(&quot;Session has should be used. Create a session.&quot;);             };           \/\/\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430             DirtyObjEvent += ObjectTracker.RegCleanObjects;             UpdateObjEvent += ObjectTracker.RegUpdatedObjects;         }         public ICollection&lt;T&gt; GetByFields&lt;T&gt;(BinaryExpression exp)          where T : EntityBase, IEntity, new()         {             \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u0431\u0434 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 DbProvider             var result = _dataSourceProvider.GetByFields&lt;T&gt;(exp);             var registratedObjs = result.Select(r =&gt; new EntityStruct(typeof(T), r)).ToList();            \/\/\u0412\u043e\u0437\u0431\u0443\u0436\u0434\u0430\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 &quot;\u0433\u0440\u044f\u0437\u043d\u044b\u0445&quot; \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432             var handler = DirtyObjEvent;             if (handler == null)                 return result;             handler(this, new DirtyObjsInfoEventArgs(registratedObjs));             return result;         }         public void Commit(ICollection&lt;EntityStruct&gt; updObjs)         {               \/\/\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 DbProvider             _dataSourceProvider.Commit(updObjs, delObjs, addObjs, packUpdObjs, deleteUpdObjs);         }         public void Dispose()         {             _dataSourceProvider.Dispose();         }     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h3>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u0442\u043e\u0433\u0438<\/h3>\n<p>  \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448\u0438 public-\u043a\u043b\u0430\u0441\u0441\u044b. <\/p>\n<p>  \u041a\u0430\u043a \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435, \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IDataSourceProvider&#8217;\u0430. \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e IDataSourceProvider&#8217;\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u00ab\u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u00bb \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0434, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441 UnitOfWork&#8217;\u0430, \u043a\u0430\u043a \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u0432 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 DefaultObjectTracker \u043f\u043e \u0432\u0441\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0434. \u041b\u043e\u0433\u0438\u0447\u043d\u043e, \u0447\u0442\u043e \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u0434: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Public &#8212; \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0440\u0438\u043c\u0443\u0442 \u0432\u0438\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public abstract class Repository&lt;T&gt; : IRepository&lt;T&gt;  where T : EntityBase, IEntity, new()     {         private readonly object _syncObj = new object();         private IDataSourceProvider _dataSourceProvider;      \/\/c \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 &quot;\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043c&quot; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0434         private IDataSourceProvider DataSourceProvider         {             get             {                 lock (_syncObj)                 {                     if (_dataSourceProvider.State == State.Close)                     {                         _dataSourceProvider = GetDataSourceProvider();                     }                     return _dataSourceProvider;                 }             }         }         private readonly string _connectionName;         protected Repository(string connectionName)         {             if (string.IsNullOrWhiteSpace(connectionName))             {                 throw new ArgumentNullException(&quot;connectionName&quot;);             }             _connectionName = connectionName;             var dataSourceProvider = GetDataSourceProvider();             if (dataSourceProvider == null)             {                 throw new ArgumentNullException(&quot;dataSourceProvider&quot;);             }             _dataSourceProvider = dataSourceProvider;         }         private IDataSourceProvider GetDataSourceProvider()         {               \/\/\u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u043a\u0438\u043d\u0433 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 DbProvider'\u0430              \/\/ \u0438\u043d\u0430\u0447\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0435\u0433\u043e \/\/\/\/\u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e - TrackerProvider             return Session.Current == null ? DataSourceProviderFactory.Create(_connectionName)                        : new TrackerProvider(_connectionName);         }         public ICollection&lt;T&gt; Get(Expression&lt;Func&lt;T, bool&gt;&gt; exp)         {             return DataSourceProvider.GetByFields&lt;T&gt;(exp.Body as BinaryExpression);         }     }      public sealed class UnitOfWork : IUnitOfWork, IDetector     {         private readonly Dictionary&lt;string, IObjectTracker&gt; _objectDetector;         Dictionary&lt;string, IObjectTracker&gt; IDetector.ObjectDetector         {             get { return _objectDetector; }         }         public UnitOfWork()         {             _objectDetector = new Dictionary&lt;string, IObjectTracker&gt;();             foreach (ConnectionStringSettings conName in ConfigurationManager.ConnectionStrings)             {                 _objectDetector.Add(conName.Name, new DefaultObjectTracker());             }         }         public void Commit()         {             SaveChanges();         }         private async void SaveChanges()         {             await Task.Run(() =&gt;                     {                     \/\/\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u0445 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0431\u0434                         foreach (var objectDetector in _objectDetector)                         {                             var provider = new TrackerProvider(objectDetector.Key);                             provider.Commit(                                 objectDetector.Value.ChangeObjects);                         }                     }                 );         }     }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e sql \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u043e \u0442\u0438\u043f\u0443 UpdateWhere, RemoveWhere).<\/p>\n<p>  \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0431\u0435\u0437 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0439, <a href=\"https:\/\/github.com\/lex1112\/MapperOrm\">\u043b\u0435\u0436\u0438\u0442 \u0442\u0443\u0442<\/a>.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/317860\/\"> https:\/\/habrahabr.ru\/post\/317860\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/ic.pics.livejournal.com\/gubarevan\/50612969\/883210\/883210_original.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u043e\u043c \u043a <s>\u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0438\u0437\u043c\u0443<\/s> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043e\u0432. \u0426\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0437\u044b\u0431\u043a\u043e\u0439 \u0442\u0435\u043c\u044b \u043a\u0430\u043a ORM.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-282664","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=282664"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282664\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}