powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
7 сообщений из 32, страница 2 из 2
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36711878
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Не видно, где и сколько книг вы создаёте, и где устанавливаете связи между ними.


Мой ответ Чемберлену
Код: plaintext
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.
    public class Book
    {
        private IList<Color> _colors;
        private string _name;
        private int _id;

        public Book()
        {
            _colors = new List<Color>();
        }
        public virtual string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public virtual IList<Color> Colors
        {
            get { return _colors; }
            set { _colors = value; }
        }

        public virtual int Id
        {
            get { return _id; }
            set { _id = value; }
        }
    }

    public class Color
    {
        private int _id;
        private string _name;
        private Book _book;

        public virtual string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public virtual int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public virtual Book Book
        {
            get { return _book; }
            set { _book = value; }
        }

Код: plaintext
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.
<?xml version="1.0" encoding="utf-8"?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate.Probing" assembly="NHibernate.Probing" default-lazy="false">

	<class name="Book" table="books">
		<id name="Id" column="Id">
			<generator class="native" />
		</id>
		<property name="Name" type="string" column="name" />
		<bag name="Colors" cascade="all-delete-orphan" inverse="true">
			<key column="BookId"/>
			<one-to-many class="Color" />
		</bag>
	</class>

	<class name="Color" table="colors">
		<id column="Id" name="Id">
			<generator class="native" />
		</id>
		<property name="Name" type="string" column="name" />
		<many-to-one name="Book" class="Book" cascade="all">
			<column name="idColor" />
		</many-to-one>
	</class>

</hibernate-mapping>

Код: plaintext
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.
    [TestFixture]
    public class NHibernateFixture
    {
        #region Setup/Teardown

        [SetUp]
        public void SetUp()
        {
            _config = new Configuration();
            _config.Configure("hibernate.cfg.xml");

            _sessionFactory = _config.BuildSessionFactory();
            new SchemaExport(_config).Drop(false, true);
            new SchemaExport(_config).Execute(true, true, false);
        }

        #endregion

        private ISessionFactory _sessionFactory;
        private Configuration _config;

        [Test]
        public void Test2()
        {
            using (ISession session = _sessionFactory.OpenSession())
            {
                Book book = new Book();

                book.Colors.Add(new Color());
                book.Colors.Add(new Color());
                book.Colors[0].Book = book;
                book.Colors[1].Book = book;

                session.SaveOrUpdate(book);
                session.Flush();
                session.Clear();

                Color color = session.Get<Color>(book.Colors[1].Id);
                session.Delete(color);
                session.Flush();
            }
        }
Код: plaintext
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.
 create table books (
        Id INT IDENTITY NOT NULL,
       name NVARCHAR(255) null,
       primary key (Id)
    )

    create table colors (
        Id INT IDENTITY NOT NULL,
       name NVARCHAR(255) null,
       idColor INT null,
       BookId INT null,
       primary key (Id)
    )

    alter table colors 
        add constraint FK5E59605F263D6D63 
        foreign key (idColor) 
        references books

    alter table colors 
        add constraint FK5E59605FDBD2D929 
        foreign key (BookId) 
        references books
NHibernate: INSERT INTO books (name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = NULL
NHibernate: INSERT INTO colors (name, idColor) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = NULL, @p1 = 1
NHibernate: INSERT INTO colors (name, idColor) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = NULL, @p1 = 1
NHibernate: SELECT color0_.Id as Id1_1_, color0_.name as name1_1_, color0_.idColor as idColor1_1_, book1_.Id as Id0_0_, book1_.name as name0_0_ FROM colors color0_ left outer join books book1_ on color0_.idColor=book1_.Id WHERE color0_.Id=@p0;@p0 = 2
NHibernate: SELECT colors0_.BookId as BookId2_, colors0_.Id as Id2_, colors0_.Id as Id1_1_, colors0_.name as name1_1_, colors0_.idColor as idColor1_1_, book1_.Id as Id0_0_, book1_.name as name0_0_ FROM colors colors0_ left outer join books book1_ on colors0_.idColor=book1_.Id WHERE colors0_.BookId=@p0;@p0 = 1
NHibernate: DELETE FROM colors WHERE Id = @p0;@p0 = 2
NHibernate: DELETE FROM books WHERE Id = @p0;@p0 = 1
18:20:38,455 ERROR [   7] AbstractBatcher [(null)]- Could not execute command: DELETE FROM books WHERE Id = @p0
System.Data.SqlClient.SqlException: DELETE statement conflicted with COLUMN REFERENCE constraint 'FK5E59605F263D6D63'. The conflict occurred in database 'Integration_Tests', table 'colors', column 'idColor'.
The statement has been terminated.
...
Рейтинг: 0 / 0
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36711951
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Прошу прощения, при мапе inverse потавил по дефолту
вот он херачит упдате.
что стоит заметить тут true не уместно при неленивой загрузке.
можем получить конфликт при удалении, если после вытаскивания, ктонить добавит еще одну буки
с таким же цветом.
ибо он не полезет в базу а просто будет удалять что вытащил джойном при первом селекте
и споткнется на солоре, а если транзакцию забыть до и книги потеряем.
а так, удаляет корректно.......
зы применительно к этому коду.
...
Рейтинг: 0 / 0
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36711965
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

а разве в буке мешок, в колоре мешок должен быть,
хотя какая разница где..
...
Рейтинг: 0 / 0
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36712064
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы в тестах применил рефреш для приближения к боевым условиям.
ленивая, inverse девфолтный.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 
            Book _book = new Book();
            _book.Color = new Color { Name = "asass" };
            _book.Name = "First book";
            session.Save(_book);
            Book book = (Book)session.CreateCriteria(typeof(Book)).Add(Expression.Eq("Name", "First book")).UniqueResult();
          
            session.Refresh(book.Color);

            session.Delete(book);
            session.Flush();
           


лог
[SRC c#]2010-06-28 21:02:11,343 [11] DEBUG NHibernate.SQL - INSERT INTO Color (Name) VALUES (@p0); select SCOPE_IDENTITY(); @p0 = 'asass'
2010-06-28 21:02:11,734 [11] DEBUG NHibernate.SQL - INSERT INTO Book1 (Name, idColor) VALUES (@p0, @p1); select SCOPE_IDENTITY(); @p0 = 'First book', @p1 = '61'
2010-06-28 21:02:11,828 [11] DEBUG NHibernate.SQL - SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.idColor as idColor0_0_ FROM Book1 this_ WHERE this_.IdColor!='0' AND this_.Name = @p0; @p0 = 'First book'
2010-06-28 21:02:11,859 [11] DEBUG NHibernate.SQL - SELECT color0_.Id as Id1_0_, color0_.Name as Name1_0_ FROM Color color0_ WHERE color0_.Id=@p0; @p0 = '61'
2010-06-28 21:02:11,890 [11] DEBUG NHibernate.SQL - SELECT book0_.IdColor as IdColor__1_, book0_.Id as Id1_, book0_.Id as Id0_0_, book0_.Name as Name0_0_, book0_.idColor as idColor0_0_ FROM Book1 book0_ WHERE book0_.IdColor=@p0; @p0 = '61'
2010-06-28 21:02:11,937 [11] DEBUG NHibernate.SQL - UPDATE Book1 SET IdColor = null WHERE IdColor = @p0; @p0 = '61'
2010-06-28 21:02:11,953 [11] DEBUG NHibernate.SQL - DELETE FROM Book1 WHERE Id = @p0; @p0 = '7'
2010-06-28 21:02:11,953 [11] DEBUG NHibernate.SQL - DELETE FROM Color WHERE Id = @p0; @p0 = '61'
...
Рейтинг: 0 / 0
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36712477
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

меж тем почти вся правда ваша. Вчера под вечер ошибся в маппинге Color. Аналогичная ошибка была и у топикстартера. Копипаст - зло. Правильный выглдяит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	<class name="Color" table="colors">
		<id column="Id" name="Id">
			<generator class="native" />
		</id>
		<property name="Name" type="string" column="name" />
		<many-to-one name="Book" class="Book" cascade="all">
			<column name="BookId" /> //Тут было idColor
		</many-to-one>
	</class>
С таким раскладом всё удаляется корректно. Но я бы всё равно не рекомендовал делать двунаправленное управление ассоциациями. Будет проще жить, если временем жизни будет управлять только один коренной объект.

Но кое-что требует отдельного уточнения.

Где-то в степиSolYUtor,

Прошу прощения, при мапе inverse потавил по дефолту
вот он херачит упдате.
что стоит заметить тут true не уместно при неленивой загрузке.
При чем тут вообще ленивая загрузка? Inverse влияет лишь на то, с какой стороны будет контролироваться изменения в двунаправленной ассоциации. Поэтому inverse=false всегда уместно, если у вас двунаправленная ассоциация, дабы NHibernate не делал лишней работы!
Где-то в степи
можем получить конфликт при удалении, если после вытаскивания, ктонить добавит еще одну буки
с таким же цветом.
ибо он не полезет в базу а просто будет удалять что вытащил джойном при первом селекте
и споткнется на солоре, а если транзакцию забыть до и книги потеряем.
а так, удаляет корректно.......
зы применительно к этому коду.

Конфликты всегда были есть и будут есть. Для этого были придуманы транзакции, но напрямую к NHibernate эта тема не относится.
...
Рейтинг: 0 / 0
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36713622
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Код: plaintext
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.
Поробую обьяснить.
все согласно мапу топикмейкера. инверсия в мешке true, не ленивая загрузка.


 ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
            ISession session = sessionFactory.OpenSession();
пользователь открывает сессию поработать с книгой

  Book book = (Book)session.CreateCriteria(typeof(Book)).Add(Expression.Eq("Name", "First book")).UniqueResult();

2010-06-29 16:48:14,796 [10] DEBUG NHibernate.SQL - SELECT this_.Id as Id0_1_, this_.Name as Name0_1_, this_.idColor as idColor0_1_, color2_.Id as Id1_0_, color2_.Name as Name1_0_ FROM Book2 this_ left outer join Color color2_ on this_.idColor=color2_.Id WHERE this_.IdColor!='0' AND this_.Name = @p0; @p0 = 'First book'
2010-06-29 16:48:15,250 [10] DEBUG NHibernate.SQL - SELECT book0_.IdColor as IdColor__2_, book0_.Id as Id2_, book0_.Id as Id0_1_, book0_.Name as Name0_1_, book0_.idColor as idColor0_1_, color1_.Id as Id1_0_, color1_.Name as Name1_0_ FROM Book2 book0_ left outer join Color color1_ on book0_.idColor=color1_.Id WHERE book0_.IdColor=@p0; @p0 = '28'

работает с книгой у меня две книги с одним цветом ( он их вытащил)
в это время другой пользователь добавил третью книгу.

первый пользователь решил удалить выбранную книгу  согласно мапу.
 ITransaction _tr = session.BeginTransaction();
            session.Delete(book);
          
            session.Flush();

2010-06-29 16:51:53,281 [10] DEBUG NHibernate.SQL - DELETE FROM Book2 WHERE Id = @p0; @p0 = '1'
2010-06-29 16:51:53,296 [10] DEBUG NHibernate.SQL - DELETE FROM Book2 WHERE Id = @p0; @p0 = '2'
// в этом месте на удалении солора екцепшен, так как естьт третья книга, и  хибер о ней ничего не знает
2010-06-29 16:51:53,312 [10] DEBUG NHibernate.SQL - DELETE FROM Color WHERE Id = @p0; @p0 = '28'

теперь инверсию в мешке сделаем дефлотную, 

 посмотрим что получится.

 Book book = (Book)session.CreateCriteria(typeof(Book)).Add(Expression.Eq("Name", "First book")).UniqueResult();

2010-06-29 17:09:08,734 [11] DEBUG NHibernate.SQL - SELECT this_.Id as Id0_1_, this_.Name as Name0_1_, this_.idColor as idColor0_1_, color2_.Id as Id1_0_, color2_.Name as Name1_0_ FROM Book2 this_ left outer join Color color2_ on this_.idColor=color2_.Id WHERE this_.IdColor!='0' AND this_.Name = @p0; @p0 = 'First book'
2010-06-29 17:09:09,171 [11] DEBUG NHibernate.SQL - SELECT book0_.IdColor as IdColor__2_, book0_.Id as Id2_, book0_.Id as Id0_1_, book0_.Name as Name0_1_, book0_.idColor as idColor0_1_, color1_.Id as Id1_0_, color1_.Name as Name1_0_ FROM Book2 book0_ left outer join Color color1_ on book0_.idColor=color1_.Id WHERE book0_.IdColor=@p0; @p0 = '28'

ITransaction _tr = session.BeginTransaction();
            session.Delete(book);
            _tr.Commit();
            session.Flush();




2010-06-29 17:11:16,484 [10] DEBUG NHibernate.SQL - UPDATE Book2 SET IdColor = null WHERE IdColor = @p0; @p0 = '28'
2010-06-29 17:11:16,515 [10] DEBUG NHibernate.SQL - DELETE FROM Book2 WHERE Id = @p0; @p0 = '1'
2010-06-29 17:11:16,515 [10] DEBUG NHibernate.SQL - DELETE FROM Book2 WHERE Id = @p0; @p0 = '2'
2010-06-29 17:11:16,531 [10] DEBUG NHibernate.SQL - DELETE FROM Color WHERE Id = @p0; @p0 = '28'
он упдатой книгу добаденную другим пользователем отправляет в мусор, исключения нет
ну естестнно where в классе на IdColor не забываем
...
Рейтинг: 0 / 0
NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
    #36713981
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Я так и не понял, где проблема. Чётко ее сформулируйте.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate cascade delete - "DELETE statement conflicted with the REFERENCE constraint"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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