Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate mapping / 7 сообщений из 7, страница 1 из 1
20.04.2010, 17:47
    #36588389
pavel.oborin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
Вопрос до банальности простой.
Есть 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
21.04.2010, 00:00
    #36589022
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
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
21.04.2010, 11:26
    #36589584
pavel.oborin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
Спасибо, Дмитрий, но было бы интересно узнать, зачем в данном случае в классе Search присутствует поле AudioFile?
...
Рейтинг: 0 / 0
21.04.2010, 11:43
    #36589634
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
pavel.oborinСпасибо, Дмитрий, но было бы интересно узнать, зачем в данном случае в классе Search присутствует поле AudioFile?
А как иначе вы предлагаете сообщить к какому AudioFile пренадлежит Search? Это связь one-to-many
...
Рейтинг: 0 / 0
21.04.2010, 18:32
    #36590910
pavel.oborin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
Дмитрий, в продолжении о.

А почему, если работать в пределах одной фабрики, то добавленный 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
21.04.2010, 23:53
    #36591328
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
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
22.04.2010, 12:01
    #36592031
pavel.oborin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping
Ну, собственно, спасибо. Всего-то и надо было, что добавить в bag lazy="false"
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate mapping / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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