powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate-2.1.2.GA && Master-Detail
11 сообщений из 11, страница 1 из 1
NHibernate-2.1.2.GA && Master-Detail
    #36548987
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
code
Код: 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.
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.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
using System;
using System.Collections.Generic;
using System.Reflection;
using NHibernate;
using NHibernate.Cfg;
using Iesi.Collections;

namespace TestII
{
	public class TableMaster
	{
		int
			_Id;

		string
			_Val;
		
		ISet
			_Details = new HashedSet();

		virtual public int Id
		{
			get
			{
				return _Id;
			}
			set
			{
				if (_Id != value)
					_Id = value;
			}
		}

		virtual public string Val
		{
			get
			{
				return _Val;
			}
			set
			{
				if (_Val != value)
					_Val = value;
			}
		}

		public virtual ISet Details
		{
			get
			{
				return _Details;
			}
			set
			{
				_Details = value;
			}
		}

		virtual public void Show()
		{
			Console.WriteLine("Id={0} -> Val=\"{ 1 }\"", Id, Val);
			foreach (TableDetail d in Details)
				d.Show();
		}

		virtual public void AddDetail(string _Val)
		{
			TableDetail
				Detail = new TableDetail();

			Detail.Master = this;
			Detail.Val = _Val;

			Details.Add(Detail);
		}
	}

	public class TableDetail
	{
		int
			_Id,
			_MasterId;

		string
			_Val;

		TableMaster
			_Master;

		virtual public int Id
		{
			get
			{
				return _Id;
			}
			set
			{
				if (_Id != value)
					_Id = value;
			}
		}

		virtual public int MasterId
		{
			get
			{
				return _MasterId;
			}
			set
			{
				if (_MasterId != value)
					_MasterId = value;
			}
		}

		virtual public string Val
		{
			get
			{
				return _Val;
			}
			set
			{
				if (_Val != value)
					_Val = value;
			}
		}

		virtual public TableMaster Master
		{
			get
			{
				return _Master;
			}
			set
			{
				_Master = value;
			}
		}

		virtual public void Show()
		{
			Console.WriteLine("Id={0} MasterId={1} -> Val=\"{ 2 }\"", Id, MasterId, Val);
		}
	}

	class Program
	{
		static ISessionFactory
			SessionFactory;

		static void Main(string[] args)
		{
			TableMaster
				m = new TableMaster();

			m.Val = "Master_X";
			m.AddDetail("Detal_X");
			m.AddDetail("Detal_XX");
			m.AddDetail("Detal_XXX");
			m.Show();

			try
			{
				using (ISession session = OpenSession())
				{
					using (ITransaction transaction = session.BeginTransaction())
					{
						session.Save(m);
						transaction.Commit();
					}
					m.Show(); // TableDetail.MasterId ==  0  ??? Ж8-/
				}
			}
			catch (Exception e)
			{
				Console.WriteLine(e);
			}

			using (ISession session = OpenSession())
			{
				IQuery
					query = session.CreateQuery("FROM TableMaster");

				IList<TableMaster>
					ms = query.List<TableMaster>();

				Console.Out.WriteLine("ms.Count = " + ms.Count);
			}

			using (ISession session = OpenSession())
			{
				using (ITransaction transaction = session.BeginTransaction())
				{
					IQuery
						query = session.CreateQuery("FROM TableMaster WHERE Id > 5");

					IList<TableMaster>
						ms = query.List<TableMaster>();

					foreach (TableMaster _m_ in ms)
						_m_.Val = "Master_Y";
					transaction.Commit();
				}
			}

			using (ISession session = OpenSession())
			{
				using (ITransaction transaction = session.BeginTransaction())
				{
					IQuery
						query = session.CreateQuery("FROM TableMaster WHERE Id > 5");

					IList<TableMaster>
						ms = query.List<TableMaster>();

					foreach (TableMaster _m_ in ms)
						session.Delete(_m_);

					transaction.Commit();
				}
			}
		}

		static ISession OpenSession()
		{
			if (SessionFactory == null)
			{
				Configuration configuration = new Configuration();

				string
					CallingAssembly = Assembly.GetCallingAssembly().FullName;

				configuration.AddAssembly(Assembly.GetCallingAssembly());
				SessionFactory = configuration.BuildSessionFactory();
			}

			return SessionFactory.OpenSession();
		}
	}
}

TableMaster.hbm.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="TestII" assembly="TestII">
  
  <class name="TableMaster" lazy="true">
    <id name="Id">
      <generator class="native" />
    </id>
    <property name="Val" column ="Val"/>
    
    <set name="Details" table="TableDetail" cascade="all" inverse="true">
      <key column="MasterId" />
      <one-to-many class="TableDetail"/>
    </set>
  </class>
  
</hibernate-mapping>

TableDetail.xbm.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="TestII" assembly="TestII">
  
  <class name="TableDetail" lazy="true">
    <id name="Id">
      <generator class="native" />
    </id>
    <many-to-one name="Master" class="TableMaster" column="MasterId" cascade="all" />
    <property name="Val" column ="Val"/>
  </class>
  
</hibernate-mapping>

DDL
Код: 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.
create table TableMaster
(
   Id int not null identity constraint pkTableMaster primary key,
   Val varchar( 254 ) null
)
go

set identity_insert TableMaster on
insert into TableMaster (Id, Val) values ( 1 , 'Master_1')
insert into TableMaster (Id, Val) values ( 2 , 'Master_2')
insert into TableMaster (Id, Val) values ( 3 , 'Master_3')
insert into TableMaster (Id, Val) values ( 4 , 'Master_4')
insert into TableMaster (Id, Val) values ( 5 , 'Master_5')
set identity_insert TableMaster off
go

create table TableDetail
(
   Id int not null identity constraint pkTableDetail primary key,
   MasterId int not null,
   Val varchar( 254 ) null,
   constraint fkMasterDetail foreign key (MasterId) references TableMaster(Id) on update cascade on delete cascade
)
go

set identity_insert TableDetail on
insert into TableDetail (Id, MasterId, Val) values ( 1 ,  1 , 'Detail_1_1')
insert into TableDetail (Id, MasterId, Val) values ( 2 ,  1 , 'Detail_1_2')
insert into TableDetail (Id, MasterId, Val) values ( 3 ,  1 , 'Detail_1_3')
insert into TableDetail (Id, MasterId, Val) values ( 4 ,  2 , 'Detail_2_1')
insert into TableDetail (Id, MasterId, Val) values ( 5 ,  2 , 'Detail_2_2')
insert into TableDetail (Id, MasterId, Val) values ( 6 ,  2 , 'Detail_2_3')
insert into TableDetail (Id, MasterId, Val) values ( 7 ,  2 , 'Detail_2_4')
set identity_insert TableDetail off
go

Типо все растолкалось и работает, но вот после сохранения, согласно m.Show(), TableDetail.MasterId == 0 ??? Ж8-/ По идее ж должно было "откаскадироваться" с TableMaster. Или это так должно быть? Или что-то еще нужно покрутить/подкрутить/пнуть?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549875
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы это сделать, нужно обращаться через родителя:

Код: plaintext
int masterId = m.Details[0].Master.Id;

У Вас же в маппинге написано:

Код: plaintext
<many-to-one name="Master" class="TableMaster" column="MasterId" cascade="all" />

вот и обращайтесь через этот Master.
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549890
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос, накой Вам Iesi коллекции? Чем не устроил <bag>?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class TableMaster
{
    public TableMaster()
    {
        Details = new List<TableDetail>();
    }

    public virtual int Id { get; set; }

    // ...

    public virtual IList<TableDetail> Details { get; protected set; }

    public virtual void AddDetails(params TableDetail[] details)
    {
        foreach (var detail in details)
        {
            this.Details.Add(detail);
            detail.Master = this;
        }
    }
}

P.S. Оформление мапа хреновенькое, без обид :)
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549895
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЧтобы это сделать, нужно обращаться через родителя
Вопрос не в этом. Вопрос в том: должен ли хибер после получения Id для TableMaster из БД рихтовать и MasterId в TableDetail ?
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549902
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftВопрос в том: должен ли хибер после получения Id для TableMaster из БД рихтовать и MasterId в TableDetail ?
Вы сами можете ответить на этот вопрос. Хиб должен только то "рихтовать", чот у него написано в мапе. В мапе у Вас написано дословно: "Все many-to-one телодвижения - через class="TableMaster""
Всё.
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549920
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИ еще вопрос, накой Вам Iesi коллекции? Чем не устроил <bag>?
Вы думаете я знаю, что это такое?
Досталось в наследство приложение с хибером (о коем я вообще ни сном, ни духом до сего момента). Вот и разбираюсь для начала с самим хибером методом научного тыка на HeloWord'ной дрозофилке. Че в exception'ах пишет - то и подрубаю. Захотело Iesi - на тебе Iesi
(мне не жалко)
МСУP.S. Оформление мапа хреновенькое
Вот как-раз и хотел спросить: как по-людськи нуна эти две мои таблице на хибере оформить?
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549937
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftВот как-раз и хотел спросить: как по-людськи нуна эти две мои таблице на хибере оформить?
Вот Вам классика Product vs Category на репозитории :)
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549957
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВ мапе у Вас написано дословно: "Все many-to-one телодвижения - через class="TableMaster""
/me думает: гм... Тогда, насколько я понял, нужно сделать одно из двух:
1. Подправить map, чтобы хибер узнал о моей хотелке и сделал все сам (и это, IMHO, правильнее).
||
2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
	public class TableMaster
	{
...
		virtual public int Id
		{
			get
			{
				return _Id;
			}
			set
			{
				if (_Id != value)
				{
					_Id = value;
					foreach(TableDetail d in Details)
						d.MasterId=value;
				}
			}
		}
...

	}
Но так я думаю никто не делает...
???
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36549984
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftТогда, насколько я понял, нужно сделать одно из двух
Ничего не нужно делать, почитайте про реализацию, которую я привёл.
P.S. К детям обращаться через IList родителя, хиб будет генерить ленивый подзапрос.
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36580102
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то снова руки дошли до дрозофилки:
Master.cs
Код: 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.
52.
53.
54.
using System.Collections;

namespace TestV
{
	public class Master
	{
		int
			_Id;

		string
			_Val;

		IList
			_Details;

		public virtual int Id
		{
			get
			{
				return _Id;
			}
			set
			{
				if (_Id != value)
					_Id = value;
			}
		}

		public virtual string Val
		{
			get
			{
				return _Val;
			}
			set
			{
				if (_Val != value)
					_Val = value;
			}
		}

		public virtual IList Details
		{
			get
			{
				return _Details;
			}
			set
			{
				_Details = value;
			}
		}
	}
}

Master.hbm.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="TestV" assembly="TestV">

  <class name="Master" table="TableMaster" lazy="true">
    <id name="Id">
      <generator class="native" />
    </id>
    <property name="Val" />

    <bag name="Details" cascade="all" lazy="true">
      <key column="MasterId"/>
      <one-to-many class="Detail"/>
    </bag>
  </class>
  
</hibernate-mapping>

Detail.cs
Код: 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.
52.
namespace TestV
{
	public class Detail
	{
		int
			_Id;

		string
			_Val;

		Master
			_Master;

		public virtual int Id
		{
			get
			{
				return _Id;
			}
			set
			{
				if (_Id != value)
					_Id = value;
			}
		}

		public virtual Master Master
		{
			get
			{
				return _Master;
			}
			set
			{
				_Master = value;
			}
		}

		public virtual string Val
		{
			get
			{
				return _Val;
			}
			set
			{
				if (_Val != value)
					_Val = value;
			}
		}
	}
}

Detail.hbm.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="TestV" assembly="TestV">

  <class name="Detail" table="TableDetail" lazy="true">
    <id name="Id">
      <generator class="native" />
    </id>
    <many-to-one name="Master" column="MasterId" class="Master" />
    <property name="Val" />
  </class>
  
</hibernate-mapping>

и на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (ITransaction transaction = session.BeginTransaction())
{
	query = session.CreateQuery("FROM Master WHERE Id > 5");
	MasterRecords=query.List<Master>();
	foreach (Master _m_ in MasterRecords)
		session.Delete(_m_);

	transaction.Commit();
}
падаем с
Exception
NHibernate.Exceptions.GenericADOException: could not delete collection: [TestV.Master.Details#27]
[SQL: UPDATE TableDetail SET MasterId = null WHERE MasterId = @p0] ---> System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'MasterId', table 'testdb.dbo.TableDetail'; column does not allow nulls. UPDATE fails.

Шо ж оно такое неразумное NULL пихает-то? Я, конечно, понимаю, что сие делается для того, чтобы в начале грохнуть запись в Master'е, а потом пробежаться по Detail. Но можно ли сказать какое-то заветное слово, чтобы оно в начале грохало в Detail'е, а потом в Master'е? В общем: что нужно прикрутить/покрутить/пнуть чтобы еще и удаление зафунциклировало?
...
Рейтинг: 0 / 0
NHibernate-2.1.2.GA && Master-Detail
    #36580286
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
<bag name="Details" cascade="all" inverse="true" lazy="true">
Спасло отца русской демократии
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate-2.1.2.GA && Master-Detail
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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