powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate mapping
7 сообщений из 7, страница 1 из 1
NHibernate mapping
    #36588389
pavel.oborin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос до банальности простой.
Есть 2 класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    public class Search
    {
        public virtual string SearchedWords { get; set; }
        public virtual int SearchId { get; protected set; }
        public virtual int AudioId { get; set; }

        public Search() {}

        public Search(int audioid, string words)
        {
            SearchedWords = words;
            AudioId = audioid;
        }
    }
и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    public class AudioFile
    {
        public virtual string FullPath { get; set; }
        public virtual int Id { get; protected set; }
        public virtual IList<Search> Searches { get; set; }

        public AudioFile() { }
        
        public AudioFile(string file)
        {
            FullPath = file;
        }
    }

есть, соответсвенно 2 таблички в базе (используется MS SQL 2008)
Код: 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.
/****** Object:  Table [dbo].[AudioFiles]    Script Date: 04/20/2010 17:43:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AudioFiles](
	[audioId] [int] IDENTITY( 1 , 1 ) NOT NULL,
	[fullPath] [text] NULL,
 CONSTRAINT [PK_AudioFiles] PRIMARY KEY CLUSTERED 
(
	[audioId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Searches]    Script Date: 04/20/2010 17:43:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Searches](
	[searchId] [int] IDENTITY( 1 , 1 ) NOT NULL,
	[wordsForSearch] [text] NULL,
	[audioId] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  ForeignKey [FK_Searches_AudioFiles]    Script Date: 04/20/2010 17:43:06 ******/
ALTER TABLE [dbo].[Searches]  WITH CHECK ADD  CONSTRAINT [FK_Searches_AudioFiles] FOREIGN KEY([audioId])
REFERENCES [dbo].[AudioFiles] ([audioId])
GO
ALTER TABLE [dbo].[Searches] CHECK CONSTRAINT [FK_Searches_AudioFiles]
GO

и, наконец, есть 2 mapping'а
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"  namespace="Data" assembly="BusinessLayer">
  <class name="Search" table="Searches" lazy="false">
    <id name="SearchId">
      <column name="searchId" not-null="false"/>
      <generator class="native"/>
    </id>
    <property name="SearchedWords" column="wordsForSearch"/>
  </class>
</hibernate-mapping>
и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Data" assembly="BusinessLayer">
  <class name="AudioFile" table="AudioFiles">
    <id name="Id" unsaved-value="0">
      <column name="audioId" not-null="true" unique="true" unique-key="PK_AudioFiles"/>
      <generator class="identity"/>
    </id>
    <property name="FullPath" column="fullPath"/>
    <many-to-one name="Searches" class="Search" column="audioId"/>
  </class>
</hibernate-mapping>


И было бы мне счастье, если бы это все вместе работало. Но, к сожалению, при попытке добавить запись в БД,
вываливается исключение:could not insert: [Data.AudioFile][SQL: INSERT INTO AudioFiles (fullPath, audioId) VALUES (?, ?); select SCOPE_IDENTITY()]

потому что:
Cannot insert explicit value for identity column in table 'AudioFiles' when IDENTITY_INSERT is set to OFF.
Вопрос, как и говорилось, до банальности простой: "Как это победить?"

З.Ы. Ответ на тему "погуглить" не актуален ;) Ответ на тему "куда ты смотрел" вполне приемлем :) Ответ на тему "равернутое изложение вопроса" наиболее желателен, поскольку БД и СУБД всегда были моим не самым сильным местом.
...
Рейтинг: 0 / 0
NHibernate mapping
    #36589022
Dmitry Sukhovilin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel.oborin,

примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"  namespace="NTest01" assembly="NTest01">
  <class name="Search" table="Searches" lazy="false">
    <id name="SearchId" type="int">
      <column name="searchId"   not-null="false"/>
      <generator class="native"/>
    </id>
    <property name="SearchedWords" column="wordsForSearch"/>
    <many-to-one name="AudioFile" class="AudioFile" column="audioId"></many-to-one>
  </class>
</hibernate-mapping>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public class Search
    {
        public virtual int SearchId { get; set; }
        public virtual string SearchedWords { get; set; }
        public virtual int AudioId { get; set; }

        public Search() { }

        public Search(int audioid, string words)
        {
            SearchedWords = words;
            AudioId = audioid;
        }

        public virtual AudioFile AudioFile { get; set; }
    }

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NTest01" assembly="NTest01">
  <class name="AudioFile" table="AudioFiles">
    <id name="Id" unsaved-value="0">
      <column name="audioId" not-null="true" unique="true" unique-key="PK_AudioFiles"/>
      <generator class="identity"/>
    </id>
    <property name="FullPath" column="fullPath"/>
    <bag name="Searches" table="Searches" cascade="all" inverse="true">
      <key column="audioId" />
      <one-to-many class="Search"/>
    </bag>
    <!--<many-to-one name="Searches" class="Search" cascade="all" column="audioId" />-->
  </class>
</hibernate-mapping>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public class AudioFile
    {
        public virtual string FullPath { get; set; }
        public virtual int Id { get; protected set; }
        public virtual IList<Search> Searches { get; set; }

        public AudioFile() {
            Searches = new List<Search>();
        }

        public AudioFile(string file)
            :this()
        {
            FullPath = file;
        }
    }

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Search s = new Search();
                s.SearchedWords = "test";

                AudioFile af = new AudioFile("Hello");
                s.AudioFile = af;
                af.Searches.Add(s);


                session.Save(af);
...
Рейтинг: 0 / 0
NHibernate mapping
    #36589584
pavel.oborin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Дмитрий, но было бы интересно узнать, зачем в данном случае в классе Search присутствует поле AudioFile?
...
Рейтинг: 0 / 0
NHibernate mapping
    #36589634
Dmitry Sukhovilin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel.oborinСпасибо, Дмитрий, но было бы интересно узнать, зачем в данном случае в классе Search присутствует поле AudioFile?
А как иначе вы предлагаете сообщить к какому AudioFile пренадлежит Search? Это связь one-to-many
...
Рейтинг: 0 / 0
NHibernate mapping
    #36590910
pavel.oborin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий, в продолжении о.

А почему, если работать в пределах одной фабрики, то добавленный AudioFile можно редактировать (т.е. добавлять в него новые Search), а при создании новой фабрики (читай, перезапуске приложения) при попытке отредактировать AudioFile пробрасывается исключение

Initializing[Data.AudioFile#3]-failed to lazily initialize a collection of role: Data.AudioFile.Searches, no session or session was closed


З.Ы. С точки зрения методологии, должно ли в классе Search быть поле AudioId, ведь его покрывает сам AudioFile?
...
Рейтинг: 0 / 0
NHibernate mapping
    #36591328
Dmitry Sukhovilin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel.oborinДмитрий, в продолжении о.

А почему, если работать в пределах одной фабрики, то добавленный AudioFile можно редактировать (т.е. добавлять в него новые Search), а при создании новой фабрики (читай, перезапуске приложения) при попытке отредактировать AudioFile пробрасывается исключение

Initializing[Data.AudioFile#3]-failed to lazily initialize a collection of role: Data.AudioFile.Searches, no session or session was closed


З.Ы. С точки зрения методологии, должно ли в классе Search быть поле AudioId, ведь его покрывает сам AudioFile?

RTFM Unit of Work
...
Рейтинг: 0 / 0
NHibernate mapping
    #36592031
pavel.oborin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, собственно, спасибо. Всего-то и надо было, что добавить в bag lazy="false"
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate mapping
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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