NHibernate如何将外键关系映射到多个属性

时间:2018-07-14 19:26:54

标签: c# nhibernate orm rdbms

我正在将NHibernate用作我的个人项目的ORM。我有一个Postgre SQL数据库用于存储,并且我试图映射表之间的多对一关系。

我有一个看起来像这样的web_exception表

CREATE TABLE logging.web_exception
(
    web_exception_id integer NOT NULL DEFAULT nextval('logging.web_exception_web_exception_id_seq'::regclass),
    query_string character varying(2048) COLLATE pg_catalog."default",
    form text COLLATE pg_catalog."default",
    cookies text COLLATE pg_catalog."default",
    session text COLLATE pg_catalog."default",
    headers text COLLATE pg_catalog."default",
    exception text COLLATE pg_catalog."default" NOT NULL,
    url character varying(2048) COLLATE pg_catalog."default" NOT NULL,
    application_id integer,
    CONSTRAINT web_exception_pkey PRIMARY KEY (web_exception_id),
    CONSTRAINT fk_web_exception_application FOREIGN KEY (application_id)
        REFERENCES public.application (application_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

我正在尝试将其映射到如下所示的WebException类。

public class WebException
{
    public virtual int WebExceptionId { get; set; }
    public virtual string QueryString { get; set; }
    public virtual string Form { get; set; }
    public virtual string Cookies { get; set; }
    public virtual string Session { get; set; }
    public virtual string Headers { get; set; }
    public virtual string Exception { get; set; }
    public virtual string Url { get; set; }
    public virtual int? ApplicationId { get; set; }

    public virtual Application Application { get; set; }
}

我遇到了同时使用ApplicationIdApplication属性映射类的问题。这两个属性都代表我在数据库中定义的application表的外键。一个显然是整数主键值,另一个是表示该表中一行的整个实体。在我的映射中,

Property(
    we => we.ApplicationId,
    m => m.Column(c => c.Name("application_id"))
);
ManyToOne(we => we.Application, mto => mto.Column("application_id"));

看起来这使NHibernate认为应该将属性映射到2个单独的列。尝试将其保存到数据库时,我收到了从NHibernates内部生成的异常消息。

  

索引超出范围。必须为非负数并且小于集合的大小。   参数名称:索引

当我删除ManyToOne映射时,保存记录就可以了。但是,我希望同时拥有这两个属性。即能够简单地在保存时设置ApplicationId属性,以在表之间创建关系,并在需要时能够将整个Application类作为WebException类的成员带回。我有什么办法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

尝试:

ManyToOne(we => we.Application, mto => { mto.Column("application_id")
                                         mto.Class(typeof(Application));
                                         mto.Update(false);
                                         mto.Insert(false);
                                         mto.Lazy(LazyRelation.NoLazy);
  });