我如何映射一个列表,其中包含相同类型的实体作为父类型使用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'

谁能帮我指出我错过了什么?

我如何映射一个列表,其中包含相同类型的实体作为父类型使用Fluent NHibernate

您没有说明错误是什么,映射与类不匹配,但我认为问题是您缺少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'"