Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос для профессионалов: каскадное + последовательное сохранение сущностей / 22 сообщений из 22, страница 1 из 1
07.09.2010, 10:57
    #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
07.09.2010, 11:34
    #36833546
barser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
А код напиши?
Там может файлу что-нить типа Session.Save(file) сделать, перед его связью с документом...
...
Рейтинг: 0 / 0
07.09.2010, 11:50
    #36833591
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
...
Рейтинг: 0 / 0
07.09.2010, 11:51
    #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
07.09.2010, 12:04
    #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
07.09.2010, 12:15
    #36833660
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
barserЕсли попробовать в AddFile после Save(...) вызвать _session.Flush() что-нибудь изменится? )
Не-а!
Попозже попробую переписать все без DAO и в одной последовательности, чтобы не метаться из метода в метод и четче понимать, что за чем выполняется.

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

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

И вообще, хватит ржать! Лучше помоги материально (советом). Напр. какого ... имя файла не передается с сервера на клиент, если оно в кириллице?
...
Рейтинг: 0 / 0
07.09.2010, 15:33
    #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
07.09.2010, 15:37
    #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
07.09.2010, 16:21
    #36834374
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
МСУ,

Вот это я называю: "рука мастера"! Спасибо!
До чего ж странные эти вэб-приложения...
...
Рейтинг: 0 / 0
07.09.2010, 16:25
    #36834381
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
ы
...
Рейтинг: 0 / 0
07.09.2010, 16:35
    #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
07.09.2010, 17:11
    #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
07.09.2010, 17:30
    #36834509
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для профессионалов: каскадное + последовательное сохранение сущностей
КурдльА вот ноги поотрывать надо тем, кто идентификаторы всех сущностей БД называет ID, а наименования - NAME!!!

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

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

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

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

а обоснование можно, хотя бы вкратце?
...
Рейтинг: 0 / 0
11.09.2010, 12:26
    #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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вопрос для профессионалов: каскадное + последовательное сохранение сущностей / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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