我如何映射一个列表,其中包含相同类型的实体作为父类型使用Fluent NHibernate
本文关键字:实体 同类型 父类 类型 NHibernate 包含相 Fluent 映射 何映射 列表 一个 | 更新日期: 2023-09-27 17:50:21
我有一个这样的实体
public class Person
{
public virtual int Pkey { get; set; }
public virtual string Name { get; set; }
public List<Person> Friends{ get; set; }
}
和它的表信息是这样的
create table Person
(
PKey int not null IDENTITY,
Name varchar (20),
primary key (PKey)
)
要获取好友列表,我要维护另一个表,如下所示
Create table Friends
(
PKey int not null IDENTITY,
PersonFKey int not null Foreign key references Person(PKey),
FriendFKey int not null Foreign key references Person(PKey)
)
现在当我像下面这样做映射时,我得到一些错误(因为映射问题)
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.Pkey);
Map(x => x.Name);
HasManyToMany(x => x.Friends).Cascade.All().Table("Friends").ParentKeyColumn("PersonFKey");
}
}
抛出的异常是,
FluentConfigurationException: "An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail."
与内部异常,
InvalidProxyTypeException: The following types may not be used as proxies:
FluentNhibernateLearning.Entities.Person: method get_Friends should be 'public/protected virtual' or 'protected internal virtual'
FluentNhibernateLearning.Entities.Person: method set_Friends should be 'public/protected virtual' or 'protected internal virtual'
谁能帮我指出我错过了什么?
您没有说明错误是什么,映射与类不匹配,但我认为问题是您缺少ChildKeyColumn
声明。在多对多映射中,必须声明父键列和子键列;父键是包含集合的类的主键,子键是集合中类的主键。
此外,您几乎不希望对多对多进行级联,因为这将导致删除删除所有相关实体。也就是说,删除一个人会删除他所有的朋友。
public class IntermediaryMap : ClassMap<Intermediary>
{
public IntermediaryMap()
{
Id(x => x.Pkey);
Map(x => x.Name);
HasManyToMany(x => x.SubBrokers).Table("Intermediary2SubBroker")
.ParentKeyColumn("IntermediaryFKey")
.ChildKeyColumn("SubBrokerFKey")
.AsSet();
}
}
我认为你需要将Friends声明为虚拟
这就是Inner Exception消息告诉你的,当它说:
"方法get_Friends应该是'public/protected virtual'或'protected internal virtual'"