如何使用Fluent NHibernate映射包含与父类型相同类型的实体的List?

时间:2012-12-31 21:23:02

标签: c# nhibernate fluent-nhibernate

我有这样的实体

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'

任何人都可以帮我指出我错过的东西吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我认为您需要将好友声明为虚拟

这就是内部异常消息告诉你的时间:

“方法get_Friends应为'公开 /受保护虚拟'或'受保护的内部虚拟'”