我在SO上看到过这样的一些问题,但我仍然无法在我的代码中使用它,尽管我的代码看起来像是接受的答案。
首先,我的映射(浓缩)
public SiteMap()
{
Table("SiteDetail");
Id(x => x.SiteId, "Id").GeneratedBy.Identity();
}
然后,另一个表的结构
CREATE TABLE [dbo].[EmailConfig](
[SiteID] [int] NOT NULL,
[Active] [int] NULL,
[HeaderText] [int] NULL,
[TrailerText] [int] NULL,
[BodyText] [int] NULL,
[CopyEmailTo] [varchar](255) NULL,
CONSTRAINT [PK_EmailConfig] PRIMARY KEY CLUSTERED ([SiteID] ASC))
这是我对象中的财产
public virtual bool EmailReceiptsEnabled { get; set; }
这是设置此属性的映射
Map(x => x.EmailReceiptsEnabled)
.Formula("(SELECT COUNT(e.SiteId) FROM EmailConfig e WHERE e.SiteId = SiteId AND e.Active = 1)");
当我评论出属性映射时,一切正常。当我将其保留时,我的存储库在尝试选择单个站点时返回null。除了尝试访问站点对象属性的页面上的空引用异常之外,不会引发任何错误。
修改
我修改了我的解决方案以撤回一个像这样的对象:
public class EmailConfiguration : CoreObjectBase
{
public virtual int SiteId { get; set; }
public virtual int Active { get; set; }
}
我的Site
班级
public virtual EmailConfiguration EmailConfiguration { get; set; }
对象的映射
public class EmailConfigurationMap : ClassMap<EmailConfiguration>
{
public EmailConfigurationMap()
{
Table("EmailConfig");
Id(x => x.SiteId);
Map(x => x.Active);
}
}
然后是我网站上的映射
References(x => x.EmailConfiguration, "Id");
它会产生错误
NHibernate.ObjectNotFoundException:不存在具有给定标识符的行
问题是EmailConfig在客户端进入应用程序配置其电子邮件之前不包含任何记录。这是无法改变的,但我需要我的应用程序才能使用这些数据。关于如何绘制这个东西的任何想法?
又一个编辑
我可以通过将属性更改为此
来使其工作public virtual IList<EmailConfiguration> EmailConfigurations { get; set; }
然后实施这场彻底的灾难
HasMany<EmailConfiguration>(x => x.EmailConfigurations)
.KeyColumn("SiteId")
.Inverse();
我想我会静静地哭,直到我能弄清楚如何让这个混乱以正确的方式运作。由于EmailConfig
表使用我的站点表的PK作为其主键,因此唯一的可能性是具有1个记录或没有记录。 References
因null而出现错误。 HasOne也不起作用(导致程序根本没有撤回我的Site
个对象而没有任何错误。)