我有以下两个类,我试图用多对多关系映射:
public class User{ public virtual int ID { get; set; } public virtual string name { get; set; } private IDictionary<int,Profile> profilesMap; public virtual IEnumerable<Profile> Profiles { get { return this.profilesMap.Select(kvp => kvp.Value); } } public User() { this.profilesMap = new SortedDictionary<int,Profile>(); } public virtual voID Add(Profile x) { profilesMap.Add(x); }}public class Profile{ public virtual int ID { get; set; } public virtual string name { get; set; }}
profilesMap的关键是配置文件顺序.因此,HBM映射如下:
<class name="User" table="User"> <ID name="ID" column="ID" type="integer"> <generator /> </ID> <property name="name" type="string" column="name" /> <map name="profilesMap" access="fIEld.camelcase" table="User_Profile"> <key column="User_ID" /> <index column="`Order`" type="integer" /> <many-to-many column="Profile_ID" /> </map></class><class name="Profile" table="Profile"> <ID name="ID" column="ID" type="integer"> <generator /> </ID> <property name="name" type="string" column="name" /></class>
这完美地工作并创建正确的多对多表:
create table User_Profile ( User_ID INT not null,Profile_ID INT not null,"Order" INT not null,primary key (User_ID,"Order"),constraint FK6BDEDC07D1EDE651 foreign key (Profile_ID) references Profile,constraint FK6BDEDC07650CB01 foreign key (User_ID) references User)
但是,我并不特别喜欢使用HBM,因为它不是真正的重构.因此,我正在尝试将其转换为FluentNHibernate.这是我尝试用户的多对多映射:
public class UserMap : ClassMap<User>{ public UserMap() { this.ID(); this.Map(o => o.name); var mapMember = Reveal.Member<User,IEnumerable<keyvaluePair<int,Profile>>>("profilesMap"); this.HasManyToMany<keyvaluePair<int,Profile>>(mapMember) .Access.CamelCaseFIEld() .AsMap<int>("`Order`") .table("User_Profile"); }}
我希望这可以工作,但是在尝试构建会话工厂时它会爆炸:
An association from the table User_Profile refers to an unmapped class: System.Collections.Generic.keyvaluePair`2[[system.int32,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[ConsoleApplication9.Profile,ConsoleApplication9,Version=1.0.0.0,PublicKeyToken=null]]
我做了很多关于如何让AsMap工作的研究,所以我把它改成了以下内容:
this.HasManyToMany<keyvaluePair<int,Profile>>(mapMember) .Access.CamelCaseFIEld().AsMap<int>("`Order`") .Element("Profile_ID",ep => ep.Type<int>()) // Added. .table("User_Profile");
但是,这会通过不包括Profile_ID中的外键(或非空约束)而产生不正确的表:
create table User_Profile ( User_ID INT not null,Profile_ID INT,primary key (User_ID,constraint FK6BDEDC07650CB01 foreign key (User_ID) references "User")
此外,在尝试向用户添加配置文件时,它也会爆炸:
var a = new User() { name = "A" };var b = new Profile() { name = "B" };a.Add(b);session.Save(b);session.Save(a);session.Flush(); // Error: Unable to cast object of type 'ConsoleApplication9.Profile' to type 'System.IConvertible'.
所以 – 我已经把头发拉了几个小时试图确定如何正确地映射这种与FNH的关系,但我似乎无法得到它.简单的多对多关系看起来很简单,但在尝试添加索引列时,它似乎不起作用.如果有人愿意帮我解决这个问题,我将不胜感激.
解决方法 你有没有看到类似问题的答案?How to map IDictionary<string,Entity> in Fluent NHibernate
我看到的一个问题是你的manytomany中使用了Element.这可能就是为什么你没有得到profile_ID的任何外键设置.另外,如果可能的话,我会尝试为profilesMap添加一个公共访问器.
为了符合您的情况,我将您的映射如下:
HasManyToMany<Profile>(ProfilesMap) //Assuming the addition of a public get accessor .Access.CamelCaseFIEld() .ParentKeyColumn("User_ID") .ChildKeyColumn("Profile_ID") .table("User_Profile") .AsMap<int>("ID");
如果您无法添加访问者,可以试试这个
HasManyToMany<Profile>(Reveal.Member<User,object>("profilesMap")) .table("User_Profile") .ParentKeyColumn("User_ID") .ChildKeyColumn("Profile_ID") .AsMap<int>("`Order`");总结
以上是内存溢出为你收集整理的c# – 无法将HBM映射到多对多的FluentNHibernate映射全部内容,希望文章能够帮你解决c# – 无法将HBM映射到多对多的FluentNHibernate映射所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)