我有这样的实体
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'
任何人都可以帮我指出我错过的东西吗?
答案 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应为'公开 /受保护虚拟'或'受保护的内部虚拟'”