我正在将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; }
}
我遇到了同时使用ApplicationId
和Application
属性映射类的问题。这两个属性都代表我在数据库中定义的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
类的成员带回。我有什么办法可以做到这一点?
答案 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);
});