Отображение FluentNhibernate один к одному - PullRequest
0 голосов
/ 10 февраля 2010

Я унаследовал унаследованное приложение, над которым у меня мало контроля. Мне нужно отобразить отношение один к одному, потому что «у пользователя может быть один из них, давайте назовем его« Отказ », но не более одного». Данные, хранящиеся в таблице «Отклонение», достаточно велики.

Так или иначе, я просто запустил эту модель, используя кошек, собак и владельца. Животное по умолчанию является беспризорным (его объект-владелец будет нулевым), пока мы не назначим владельца. Кошки и собаки - оба животные. Классы выглядят так. По закону вам разрешено иметь только одного питомца ;-)

public abstract class Entity {
    public virtual int Id { get; set; }
}

public class Animal : Entity {
    public virtual string Name { get; set; }
    public virtual Owner Owner { get; set; }
}

public class Dog : Animal {
    public virtual string Bark { get; set; }
}

public class Cat : Animal {
    public virtual string Colour { get; set; }
}

public class Owner : Entity {
    public virtual string Name { get; set; }
    public virtual Animal Pet { get; set; }
}

А файлы сопоставления для Животного и Владельца выглядят так:

public class OwnerMap : ClassMap<Owner> {
    public OwnerMap() {
        Id(x => x.Id).Column("animal_id");
        Map(x => x.Name);
        References(x => x.Pet, "animal_id").Cascade.SaveUpdate().ForeignKey();
    }
}
public class AnimalMap : ClassMap<Animal> {
    public AnimalMap() {
        Id(x => x.Id).Column("animal_id");
        Map(a => a.Name);
        HasOne(x => x.Owner).PropertyRef(p => p.Pet).Cascade.All().Fetch.Join();
    }
}

Теперь о проблеме. Я могу вставить данные в базу данных, и sql, сгенерированный nhibernate:

INSERT INTO [Animal] ([Name]) VALUES (@p0); select SCOPE_IDENTITY();@p0 = 'Odie'
INSERT INTO [Dog] ([Bark], [animal_id]) VALUES (@p0, @p1);@p0 = 'bark', @p1 = 1
INSERT INTO [Owner] ([Name], [animal_id]) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'Jon', @p1 = 1

Данные действительно появляются в базе данных, , но , тогда я получаю ошибку 'NHibernate.AssertionFailure: нулевой идентификатор' после вызова Session.save (animal). Я думаю, что проблема с последним битом SQL msgstr "выберите SCOPE_IDENTITY ()", который возвращает ноль. Это связано с тем, что первичный ключ таблицы владельцев должен исходить из таблицы животных.

Кто-нибудь может подсказать, как мне правильно отобразить это в FNH? Любая помощь ценится. Dai

Схема таблицы

CREATE TABLE [dbo].[Animal](
    [animal_id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL, 
    CONSTRAINT [PK_Animal] PRIMARY KEY CLUSTERED ([animal_id] ASC ) 
    WITH PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]) ON [PRIMARY]


CREATE TABLE [dbo].[Owner](
    [animal_id] [int] NOT NULL,
    [Name] [nvarchar](50) NULL, CONSTRAINT [PK_owner2] 
    PRIMARY KEY CLUSTERED (
    [animal_id] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
    IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
    ON [PRIMARY] ) ON [PRIMARY]

1 Ответ

0 голосов
/ 10 февраля 2010

В зависимости от вашего сопоставления в таблице «Владелец» должен быть столбец «animal_id», в котором хранится его ID (его первичный ключ). Но это то же самое, что и имя столбца, в котором хранится идентификатор (внешний ключ) животного, которым обладает данный экземпляр Owner.

Можете ли вы опубликовать свою фактическую схему БД?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...