powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
22 сообщений из 22, страница 1 из 1
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833455
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условие:
Имеются 3 сущности: Документ, Задача, Файл.
Связи в ER-нотации:
Код: plaintext
[Задача] >---------< [Документ] +-------+< [Файл]
(плюсы с обеих сторон: "у файла обязательно должен быть документ, а у документа должен быть хотя бы один файл)
Новый документ
Если новый документ создается вне связи с задачей, то сущности Документ и Файл "отсылаются" в БД внутри одной транзакции. Все работает корректно.
Если существующий документ приаттачивается к задаче - обновление ассоциации берет на себя Задача. Отрабатывает корректно.
А вот если пытаться приаттачить к задаче вновь созданный документ с вновь созданным файлом - вылетает исключение: object references an unsaved transient instance - save the transient instance before flushing. Type: Document, Entity: Document

Трассировка запросов:
Код: plaintext
1.
2.
3.
INSERT INTO DOCUMENTS ... -- все поля и их корректные значения
INSERT INTO FILES ... -- все поля и их корректные значения
ERROR: Could not synchronize database state with session
Вот тут мои и без того скудные познания в Nhibernate вызывают отторжение мозга...
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833546
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А код напиши?
Там может файлу что-нить типа Session.Save(file) сделать, перед его связью с документом...
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833591
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833594
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserА код напиши?
DocumentRepository:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public int AddDocumentWithFile(Document document, HttpPostedFileBase data)
        {
            Document targetDocument = new Document();
            targetDocument.DOC_ACTUAL = document.DOC_ACTUAL;
 ...
            DbFileRepository fileRepository = new DbFileRepository(_session);
            ITransaction transaction = _session.BeginTransaction();
            try
            {
                GenericDAOImpl<Document>.Save(targetDocument, _session);
                fileRepository.AddFile(targetDocument, data);
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw new Exception(ex.Message);
            }
            return targetDocument.DOC_ID;
        }
DbFileRepository:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        public int AddFile(Document document, HttpPostedFileBase data)
        {
            DbFile targetFile = new DbFile();
            targetFile.FILE_NAME = Path.GetFileName(data.FileName);
            targetFile.FILE_EXTENTION = Path.GetExtension(data.FileName);
            targetFile.FILE_DATE_CREATION = DateTime.Now;
            targetFile.FILE_VERSION = 1;
            targetFile.FILE_MIME_TYPE = data.ContentType;
            targetFile.FILE_SIZE = data.ContentLength;
            targetFile.FILE_BODY = new byte[data.ContentLength];
            targetFile.Document = document;
            targetFile.Employee = document.Employee;
            data.InputStream.Read(targetFile.FILE_BODY, 0, data.ContentLength);

            GenericDAOImpl<DbFile>.Save(targetFile, _session);

            return targetFile.FILE_ID;
        }
GenericDAOImpl:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public static class GenericDAOImpl<TEntity>
    {
...
        public static TEntity Save(TEntity entity, ISession session)
        {
            if (!session.Transaction.IsActive)
            {
                using (var tx = session.BeginTransaction())
                {
                    session.SaveOrUpdate(entity);
                    tx.Commit();
                }
            }
            else
            {
                session.SaveOrUpdate(entity);
            }
            return entity;
        }
    }
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833625
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курдль,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public int AddFile(Document document, HttpPostedFileBase data)
        {
            DbFile targetFile = new DbFile();
...
            GenericDAOImpl<DbFile>.Save(targetFile, _session);

            return targetFile.FILE_ID;

Возможно, я и не прав, но после GenericDAOImpl.Save он targetFile еще не комитит , а просто помечает как persistent (ну и id из сиквенса берет, например)... А на момент, когда у тебя транзакция комитится, targetFile уже не существует... Если попробовать в AddFile после Save(...) вызвать _session.Flush() что-нибудь изменится? )
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833660
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barserЕсли попробовать в AddFile после Save(...) вызвать _session.Flush() что-нибудь изменится? )
Не-а!
Попозже попробую переписать все без DAO и в одной последовательности, чтобы не метаться из метода в метод и четче понимать, что за чем выполняется.

Подвох в том, что этот код корректно выполняется, если не создавать ассоциацию Задача - Документ.
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833934
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль, за архитектуру репозитория двойка. С какого понталыку в дале курятся вебовские грабли, типа HttpPostedFileBase? А если этот дал будет раскуривать вин приложение, CLR проца, SSIS пакет и иже?
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36833999
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давненько Чирфунька не было на сайте. Раньше он заведовал отделом "Исследований инновационных технологий и алгоритмов", причём, даже в разрезе веба. Щас его должность подхватил Курдлёк
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834207
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКурдль, за архитектуру репозитория двойка. С какого понталыку в дале курятся вебовские грабли, типа HttpPostedFileBase? А если этот дал будет раскуривать вин приложение, CLR проца, SSIS пакет и иже?

Ничто ничему не противоречит! Никто не запрещает в репозитории работать с какими угодно классами (а HttpPostedFileBase - такой же класс, как остальные). К тому же вин приложение к этой АС давно раскурено на борланде и никаким идеальным ДАЛом его не улучшишь (мир его живому праху!).
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834230
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

И вообще, хватит ржать! Лучше помоги материально (советом). Напр. какого ... имя файла не передается с сервера на клиент, если оно в кириллице?
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834245
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльНичто ничему не противоречит!
Противоречит. Вы жестко прибиваете дал вебовскими костылями.

Сигнатура метода AddDocumentWithFile должна быть двух вариантов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
public int AddDocumentWithFile(Document document, FileWrapper data) ...

...

public class FileWrapper
{
    public string FileName { get; set; }
    public string ContentType { get; set; }
}

или

Код: plaintext
public int AddDocumentWithFile(Document document, string FileName, string ContentType) ...

КурдльНикто не запрещает в репозитории работать с какими угодно классами (а HttpPostedFileBase - такой же класс, как остальные).
Вы - уволенынах, коллега :)
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834255
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльМСУ, И вообще, хватит ржать!
Ну так я ж, это самое, советую как бы, ёпт.

КурдльЛучше помоги материально (советом). Напр. какого ... имя файла не передается с сервера на клиент, если оно в кириллице?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
if(Request.Browser.IsBrowser("IE"))
{
    FileName= HttpUtility.UrlPathEncode(FileName);
}

Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", FileName));
Response.ContentType = "...";
Response.Buffer = false;

?
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834374
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Вот это я называю: "рука мастера"! Спасибо!
До чего ж странные эти вэб-приложения...
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834381
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ы
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834401
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль, еще замечание, аж глаз режет. Ну называйте атрибуты сущностей нормальными именами!

Код: plaintext
1.
2.
3.
4.
5.
6.
doc.DOC_ID
doc.DOC_ACTUAL
file.FILE_BODY
file.FILE_MIME_TYPE
file.FILE_ID
...

... поубивал бы :(

Код: plaintext
doc.DocumentId, doc.Actual, file.FileBody, file.MimeType, file.FileId

P.S. Отдаёт дельфятинно-сиквельным/оракульным ламеризмом.
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834472
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКурдль, еще замечание, аж глаз режет. Ну называйте атрибуты сущностей нормальными именами!

Код: plaintext
1.
2.
3.
4.
5.
6.
doc.DOC_ID
doc.DOC_ACTUAL
file.FILE_BODY
file.FILE_MIME_TYPE
file.FILE_ID
...

... поубивал бы :(

Код: plaintext
doc.DocumentId, doc.Actual, file.FileBody, file.MimeType, file.FileId

P.S. Отдаёт дельфятинно-сиквельным/оракульным ламеризмом.

Вот уж фигушки!!!
Я нашел такую удобную для себя рекомендацию и не откажусь от нее!
И еще заставлю применять ее всех, кто от меня зависит!

А вот ноги поотрывать надо тем, кто идентификаторы всех сущностей БД называет ID, а наименования - NAME!!!

MS Oracle SQL Server FOREVER!!!
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834509
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльА вот ноги поотрывать надо тем, кто идентификаторы всех сущностей БД называет ID, а наименования - NAME!!!

MS Oracle SQL Server FOREVER!!!
Когда под руководством Муси подрастешь и будешь мучиться где прогерскаое, где БДшное, где интерфейсное, где пользовательское имя долбаное, поймешь, что свойства тоже надо типизировать и самое просто nameи id :)
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834522
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахаватушка, милок, видали мы Ваш код, помолчали бы уж

P.S. Курдль, C#/VB .NET Coding Guidelines
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834574
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosпоймешь, что свойства тоже надо типизировать и самое просто nameи id :)
Для тех, кто создает БД на коленке или при помощи "искусственного интеллекта" типа NH - может и проканает.

МСУP.S. Курдль, C#/VB .NET Coding Guidelines

Имена свойств персистентных классов должны отличаться от свойств обычных классов! ТОЧКА! ОБСУЖДЕНИЮ НЕ ПОДЛЕЖИТ!
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36834744
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльТОЧКА! ОБСУЖДЕНИЮ НЕ ПОДЛЕЖИТ!
Имею мнение, хрен оспоришь!
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36835159
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курдль
Имена свойств персистентных классов должны отличаться от свойств обычных классов! ТОЧКА! ОБСУЖДЕНИЮ НЕ ПОДЛЕЖИТ!

а обоснование можно, хотя бы вкратце?
...
Рейтинг: 0 / 0
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
    #36841651
Alexey Gorbach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, а для чего Вы бросаете исколючения вот таким странным образом

Код: plaintext
1.
2.
3.
4.
5.
           catch (Exception ex)
            {
                transaction.Rollback();
                throw new Exception(ex.Message);
            }

Неужели при отладке, или при записи в лог вы не хотите видеть StackTrace и InnerException?

Не лучше ли было был сделать вот так:

Код: plaintext
1.
2.
3.
4.
5.
           catch (Exception ex)
            {
                transaction.Rollback();
                throw;
            }

Или еще проще:

Код: plaintext
1.
2.
3.
4.
5.
6.
            using (ITransaction transaction = _session.BeginTransaction())
            {
                GenericDAOImpl<Document>.Save(targetDocument, _session);
                fileRepository.AddFile(targetDocument, data);
                transaction.Commit();
            }
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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