簡體   English   中英

FluentNhibernate一對一映射

[英]FluentNhibernate mapping one-to-one

我繼承了一個我無法控制的舊應用程序。 我需要映射一對一的關系,因為“用戶可能有其中一種,可以稱它們為'拒絕',但不能超過一個”。拒絕表中存儲的數據非常大。

無論如何,我只是用貓,狗和一個主人來簡化這個模型。 默認情況下,動物是流浪動物(其所有者對象將為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(animal)之后,我得到了一個錯誤'NHibernate.AssertionFailure:null identifier'我認為問題出在SQL的最后一位“ select SCOPE_IDENTITY()”,該函數返回null 。 這是因為所有者表主鍵需要來自動物表。

誰能建議我如何在FNH中正確映射此地圖? 任何幫助。

表架構

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]

根據您的映射,“所有者”表應該有一個名為“ animal_id”的列,用於存儲 ID(主鍵)。 但這與存儲此Owner實例具有的動物的ID(外鍵)的列的名稱相同。

您可以發布實際的數據庫架構嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM