Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
1

Ошибка сохранения данных NHibernate

19.12.2017, 14:52. Показов 538. Ответов 10

Добрый день!
Есть два класса "Месячный показатель" и "Тип плана"
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    public class MonthValue
    {
        public virtual int Id { get; set; }
        public virtual TypeOfPlan TypeOfPlan { get; set; }
        public virtual TypeOfValue TypeOfValue { get; set; }
        public virtual DeliveryPlace DeliveryPlace { get; set; }
        public virtual double Value { get; set; }
        public virtual DateTime Date { get; set; }
        public virtual int Order { get; set; }
       
 
    }
    public class MonthValueMap : ClassMap<MonthValue>
    {
        public MonthValueMap()
        {
            Id(x => x.Id).Column("id");
            Map(x => x.Date).Column("date_c");
            References(x => x.DeliveryPlace).Cascade.SaveUpdate();
            References(x => x.TypeOfPlan).Cascade.SaveUpdate() ;
            References(x => x.TypeOfValue).Cascade.SaveUpdate();
            Map(x => x.Value).Column("monthValue");
            Table("MonthValue");
        }
    }
 
    public class TypeOfPlan : Entity
    {
 
        public virtual int? Order { get; set; }
        private IList<MonthValue> _monthValue;
        public virtual IList<MonthValue> MonthValues
        {
            get
            {
                return _monthValue ?? (_monthValue = new List<MonthValue>());
            }
            set { _monthValue = value; }
        }
        public override string ToString()
        {
            return base.Description;
        }
    }
 
 
    public class TypeOfPlanMap : ClassMap<TypeOfPlan>
    {
        public TypeOfPlanMap()
        {
            Id(x => x.Id).Column("id");
            Map(x => x.Description).Column("description");
            Map(x => x.Order).Column("order");
            HasMany(x => x.MonthValues).Inverse();
            Table("ref_typeOfPlan");
        }
    }
Если попробовать сохранить запись класса Месячный показатель, то получаем ошибку "NHibernate.Exceptions.GenericADOException: "could not update: [Sales.Data_model.TypeOfPlan#1][SQL: UPDATE ref_typeOfPlan SET description = ?, order = ? WHERE id = ?]"

Если убрать в классе Тип плана свойство Order (и ссылку в Map-классе), то сразу всё становится хорошо. Почему так? Где копать?

Добавлено через 3 минуты
Ой, заработало. После того как закомментировал строку session.Flush();

C#
1
2
3
4
5
6
            using (var session = NHibernateHelper.OpenSession(Common.DBpath))
            {
                if (mv.Id == 0) session.Save(mv);
                else session.Update(mv);
               // session.Flush();
            }
Добавлено через 47 секунд
В другом случае, без этой строки данные не хотели добавляться в БД. Подскажите, пожалуйста, её смысл.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2017, 14:52
Ответы с готовыми решениями:

Ошибка сохранения данных "Ошибка преобразования значения varchar "id" в тип данных int"
private void btnSaveSettings_Click(object sender, EventArgs e) { string...

При попытке сохранения данных ошибка: Необходимо объявить скалярную переменную
Разбираюсь слабо. Тут идет сохранение изменений из dataGridView в бд slq. Ошибка на строке: int...

NHibernate. Материализация данных
Суть проблемы изложена тут ...

Ошибка сохранения данных
Подскажите (кто разбирается), почему при вводе данных, в памяти остается только запись о последнем...

10
Эксперт .NET
9427 / 6795 / 1092
Регистрация: 21.01.2016
Сообщений: 25,770
19.12.2017, 18:33 2
Цитата Сообщение от wrq2017 Посмотреть сообщение
Подскажите, пожалуйста, её смысл.
А в документации почитать не судьба?
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
19.12.2017, 22:25  [ТС] 3
Usaga, судьба. Если сказать своими словами (насколько я понял), то этот метод вызывает непосредственное применение накопленных изменений объектов к БД, т.е. применяет все операции с объектами в памяти непосредственно к данным в БД.
Вопрос не праздный, а в контексте вышеописанной ситуации. Т.е. почему этот метод (Flush) в данном случае приводит к ошибке? И, наоборот, в некоторых случаях данные в БД не обновляются без его использования?
0
Эксперт .NET
9427 / 6795 / 1092
Регистрация: 21.01.2016
Сообщений: 25,770
20.12.2017, 06:51 4
wrq2017, на SO говорят, что данный метод нужно вызывать только, когда вы сами соединение с базой устанавливаете. В остальных случаях, этот метод трогать не надо.

Так же, что по той ссылке, что в документации, оговаривается, что закрытие транзакции само вызывает Flush(). Рекомендую сесть и почитать документацию уже, а не создавать темы пачками.
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
20.12.2017, 15:18  [ТС] 5
Цитата Сообщение от Usaga Посмотреть сообщение
Рекомендую сесть и почитать документацию уже, а не создавать темы пачками.
Всё можно где-то найти и почитать. Вопрос в том, что на изучение постоянно совершенствующихся технологий может уйти больше времени, чем непосредственно на разработку. Поэтому иногда проще спросить у профессионалов на форуме, собственно, для чего он и создавался. Разве не так?
0
Эксперт .NET
9427 / 6795 / 1092
Регистрация: 21.01.2016
Сообщений: 25,770
20.12.2017, 17:01 6
wrq2017, ну да. Только выбранный вами ORM не особо популярен среди .NET-разработчиков, поэтому, как вы видите, особой помощи вы можете и не получить.

Почему вы его выбрали?
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
20.12.2017, 20:18  [ТС] 7
Цитата Сообщение от Usaga Посмотреть сообщение
Почему вы его выбрали?
Как, вероятно, и у многих выбор был между EF и NHibernate. Но, так как БД сделана на Access, а у EF отсутствует драйвер для данной СУБД (или я просто не нашел), то выбор оказался очевидным. Access выбран в силу корпоративных ограничений. Если появится возможность, то перейду на MS SQL Server, но в любом случае, в приложении уже разделены уровни DAL и BLL.
0
Эксперт .NET
9427 / 6795 / 1092
Регистрация: 21.01.2016
Сообщений: 25,770
20.12.2017, 20:27 8
wrq2017, EF-провайдер нашёлся быстро: ссылка на NuGet-пакет. Переделывать, конечно же, уже поздно (или нет?).

Про корпоративные ограничения и Access я комменировать не стану (уже устал). Но имейте в виду, что есть и совершенно бесплатные и полноценные (!) СУБД, для которых есть EF-провайдеры (PostgreSQL, MySQL, FireBird - говорят, что говно, но для кучи пусть будет).

В следующий раз выберите что-то из этого. По EF помощь будет гарантированно. По NHibernate - хз, только на StackOverflow.

Добавлено через 4 минуты

Не по теме:

Кстати, вы знали, что Access и EF одна фирма разрабатывает? И она не российская, где отечественные номера к отечественным же авто не подходят)

0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
20.12.2017, 22:10  [ТС] 9
Цитата Сообщение от Usaga Посмотреть сообщение
EF-провайдер нашёлся быстро: ссылка на NuGet-пакет.
Эээ... Поиском находил одного стороннего разработчика, но так и не понял чем закончился его проект.
Цитата Сообщение от Usaga Посмотреть сообщение
Переделывать, конечно же, уже поздно (или нет?).
Да переделывать никогда не поздно.
Цитата Сообщение от Usaga Посмотреть сообщение
Но имейте в виду, что есть и совершенно бесплатные и полноценные (!) СУБД, для которых есть EF-провайдеры (PostgreSQL, MySQL, FireBird
Правильно ли я понимаю, что для любых файловых (не серверных!) СУБД есть одна фундаментальная проблема - если файл заблокирован для записи одним пользователем, то другой уже ничего записать не может? В чем тогда принципиальное отличие Аксесс от других несерверных СУБД. Моё ограничение касается того, что я не могу разместить где-либо серверную СУБД. Или могу, но процесс паспортизации может занять оооооочень много времени (>1,5 лет) и не факт, что закончится положительно.
Цитата Сообщение от Usaga Посмотреть сообщение
По EF помощь будет гарантированно. По NHibernate - хз, только на StackOverflow.
Да мне кажется, что я не планирую делать каких-то супер сложных вещей. Получил данные, обработал, сформировал отчет, сохранил. Всё. А формировать тонны какого-то непонятного кода не хочется. Я когда попробовал EF, у меня только один вопрос был - а если что-то изменится в модели данных, пойму ли я где и что надо поменять.
Цитата Сообщение от Usaga Посмотреть сообщение
Кстати, вы знали, что Access и EF одна фирма разрабатывает?
Догадывался
0
Эксперт .NET
9427 / 6795 / 1092
Регистрация: 21.01.2016
Сообщений: 25,770
21.12.2017, 06:23 10
wrq2017, принципиальное отличие Access от того же SQLite в том, что это не только СУБД, но сразу и приложение для управления ей, построения запросов, форм, отчётов и всякая прочая дребедень. Access задумывался как бомж-СУБД для дома и малого бизнеса, не требующая навыков программирования. Всё делается мышкой в визуальном редакторе. Это потом к нему прикрутили VB, а в последствии даже хранимые процедуры.

Если вы ничем таким не пользуетесь, то для вас преимуществ перед SQLite нет. Более того: Access платный.

Цитата Сообщение от wrq2017 Посмотреть сообщение
Да мне кажется, что я не планирую делать каких-то супер сложных вещей. Получил данные, обработал, сформировал отчет, сохранил. Всё. А формировать тонны какого-то непонятного кода не хочется. Я когда попробовал EF, у меня только один вопрос был - а если что-то изменится в модели данных, пойму ли я где и что надо поменять.
Ну так это и для NHibernate всё справедливо. EF не требует тонн непонятного кода (но не запрещает написание оного). Вот простой примерчик:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Data.Entity;
using System.Linq;
using System.Text;
 
namespace EfExperiments2
{
    class User
    {
        public int Id { get; set; }
        public string Nickname { get; set; }
        public Address Address { get; set; }
    }
 
    class Address
    {
        public int Id { get; set; }
        public string FullAddress { get; set; }
    }
 
    class TestContext: DbContext
    {
        public TestContext() : base("base")
        {
        }
 
        public DbSet<User> Users { get; set; }
        public DbSet<Address> Addresses { get; set; }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
 
            // Заносим пользователя с адресом
            using (var con = new TestContext()) {
                User u = new User()
                {
                    Nickname = "Ленин",
                    Address = new Address()
                    {
                        FullAddress = "Мавзолей"
                    }
                };
 
                con.Users.Add(u);
                con.SaveChanges();
            }
 
            // Меняем адрес не трогая пользователя
            using (var con = new TestContext()) {
                Address a = con.Addresses
                    .FirstOrDefault(x => x.FullAddress == "Мавзолей");
 
                if (a != null) {
                    a.FullAddress = "Козырной коттеджик на площади";
                }
                con.SaveChanges();
            }
 
            // Проверяем, что получилось
            using (var con = new TestContext())
            {
                var u = con.Users
                    .Include(x => x.Address)
                    .FirstOrDefault(x => x.Nickname == "Ленин");
 
                Console.WriteLine($"Username:{u.Nickname}");
                if (u.Address != null) {
                    Console.WriteLine($"Address:{u.Address.FullAddress}");
                }
            }
 
            Console.WriteLine("Press any key to terminate...");
            Console.ReadKey();
        }
    }
}
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
21.12.2017, 10:40  [ТС] 11
Ок. Убедили В будущем попробую использовать EF.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2017, 10:40

Ошибка сохранения данных var_export
Если делается сохранение var_export в .txt файл (или любой другой но не php) то все данные выглядят...

Ошибка при попытке сохранения данных в XML файл
При попытке сохранения данных в XML файл вылетает ошибка &quot;Ссылка на объект не указывает на...

Ошибка при изменении данных и попытке сохранения в программе
В общем столкнулся с такой проблемой. Есть вычисляемый столбец &quot;Стаж&quot;. При изменении данных и...

System.Runtime.InteropServices.ExternalException: "В GDI+ возникла ошибка общего вида." Ошибка сохранения файла
У меня есть задача сделать что-то наподобие Paint. И проблема с сохранением файла. 1) Выбираем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru