FluentNhibernate映射一对一

时间:2010-02-10 16:30:36

标签: asp.net sql asp.net-mvc nhibernate fluent-nhibernate

我已经遗留了遗留应用程序,我无法控制。我需要映射一对一的关系,因为“用户可能有其中一个,我们称之为'拒绝',但不能超过一个”存储在拒绝表中的数据非常大。

无论如何,我使用猫,狗和主人简化了这个模型。默认情况下,动物是迷路的(其所有者对象将为null),直到我们分配所有者为止。猫和狗都是动物。这个类看起来像这样。根据法律,你只允许一个宠物;-)

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();
    }
}

现在出现问题。我能够将数据插入数据库,而nhibernate生成的sql是:

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

数据确实出现在数据库中,但是然后我在调用Session.save(动物)后得到错误'NHibernate.AssertionFailure:null identifier'我认为问题出在最后一点SQL“select SCOPE_IDENTITY()”返回null。这是因为Owner Table主键需要来自Animal Table。

有谁能建议我如何在FNH中正确映射?任何帮助appriciated。 戴

表Schema

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 :(得分:0)

根据您的映射,Owner表应该有一个名为“animal_id”的列,用于存储 ID(其主键)。但这与存储此所有者所拥有的动物的ID(外键)的列的名称相同。

您可以发布实际的数据库架构吗?