NHibernate-从多个数据库表映射实体

NHibernate-从多个数据库表映射实体,nhibernate,Nhibernate,是否可以从不同的数据库表映射实体属性?假设你有下面的数据模型 [dbo.Albums] [dbo.Songs] [dbo.Artists] AlbumID int (PK) SongID int (PK) ArtistID int (PK) AlbumName nvarchar(100) AlbumID int ArtistName nvarchar(100) .

是否可以从不同的数据库表映射实体属性?假设你有下面的数据模型

[dbo.Albums]              [dbo.Songs]                [dbo.Artists]
AlbumID int (PK)          SongID int (PK)            ArtistID int (PK)
AlbumName nvarchar(100)   AlbumID int                ArtistName nvarchar(100)
.                         SongName nvarchar(50)      .
.                         Duration int               .
.                         ArtistID int               .
.                         .
所需实体:

public class Album
{
    public virtual int AlbumID { get; private set; }
    public virtual string AlbumName { get; set; }
    public List<Song> songs { get; set;}
}

public class Song
{
    public virtual int SongID { get; private set; }
    public virtual int AlbumID { get; set; }
    public virtual string SongTitle { get; set; }
    public virtual int Duration { get; set; }
    public virtual ArtistID { get; set; }
    public virtual ArtistName { get; private set; }      <- from different table, read only
}
公共类相册
{
公共虚拟int AlbumID{get;private set;}
公共虚拟字符串名称{get;set;}
公共列表歌曲{get;set;}
}
公开课歌曲
{
公共虚拟int SongID{get;私有集;}
公共虚拟int AlbumID{get;set;}
公共虚拟字符串SongTitle{get;set;}
公共虚拟整数持续时间{get;set;}
公共虚拟ArtistID{get;set;}

公共虚拟艺人名称{get;private set;}在我看来,您应该有一个歌曲实体和一个艺人实体。获取所需歌曲以及艺人详细信息,并创建歌曲DTO(数据传输对象)

SongDTO将包含您需要的所有属性


提取所需的数据并组装一个SongDTO,用于推送电线。

在我看来,您应该有一个Songs实体和一个Artists实体。获取所需的歌曲以及艺术家详细信息,并创建一个song DTO(数据传输对象)

SongDTO将包含您需要的所有属性


提取所需的数据并汇编一首歌曲,以便推过网络。

尝试回答您的问题,不确定该代码现在是否在NHibernate的主干中,但它提供了您所需的信息。

尝试回答您的问题,不确定该代码现在是否在NHibernate的主干中,但它提供了您所需的信息。

发送没有任何用处额外的信息是通过网络传输的,但是为什么您要担心呢?我怀疑您甚至不能在非批处理场景中使用它来测量差异


“过早的性能优化是万恶之源”

通过网络发送额外的信息是没有用的,但您为什么担心这一点?我怀疑您甚至无法在非批处理场景中使用它来衡量差异


“过早的性能优化是万恶之源”

Ayendes回答说;不久前,我发布了关于在实体框架中将n个表映射到单个实体的能力的帖子。当时我不喜欢它,我从Hibernate文档中引用的是,这会阻止这种行为。我认为如果你尝试这样做,那将是错误的。啊,但是这个人自己发现了一种需要打破的情况他自己的规则。在这种情况下,这是fjaus做出的务实决定,我们是谁来判断气味的强度与交货的匆忙程度?@MrTelly我同意可能会有这种特殊情况,但根据给出的细节,这对我来说是错误的(我的意见)。这似乎是一个简单化的问题,不需要过于复杂。Ayendes回答说;不久前,我发布了关于在实体框架中将n个表映射到单个实体的能力的帖子。当时我不喜欢它,我引用了Hibernate文档中的话,这是阻止这种行为的原因。我想如果你尝试这样做的话,它会很好错。啊,但是这个人自己发现了一种情况,他需要打破自己的规则。在这种情况下,这是fjaus做出的一个务实的决定,我们是谁来判断气味的强弱与交货的匆忙程度?@Telly先生,我同意可能会有这种特殊情况,但根据给出的细节,这可能是错误的n对我来说方法是错误的(我的意见)。这似乎是一个简单化的问题,不需要过于复杂。谢谢你的回答。我考虑过使用dto,但我并不想维护两个对象。我只是想出上面的例子来解决我的问题。我正试图使用的实际数据库(用于工作)有数百个表,这意味着数百个实体。我想我可以只在特殊需要的情况下使用dto,在其他情况下使用标准实体。我想这可能是一个常见的情况。是的,dto是额外的对象,但正如你自己正确地说的,你可以在这些特殊情况下使用混合。它没有100%使用DTO。感谢您的回复。我考虑过使用DTO,但我并不想维护两个对象。我只是想出了上面的示例来解决我的问题。我正在尝试使用的实际数据库(用于工作)有数百个表,这意味着数百个实体。我想我可以只在特殊需要的情况下使用dto,在其他情况下使用标准实体。我想这可能是一个常见的情况。是的,dto是额外的对象,但正如你自己正确地说的,你可以在这些特殊情况下使用混合。它没有100%使用率。通过阅读ayende的帖子,我假设我的情况不可能。看起来两个引用表上的PK必须相同才能工作。或者我读错了吗?通过阅读ayende的帖子,我假设我的情况不可能。看起来两个引用表上的PK必须相同才能工作。还是我读错了?