2010-12-18 103 views
3

我使用流利的Nhibernate来映射一个简单的类
并使用Schema Generation在MySQL DB上创建这个类。
我不能使用的IList <>我的属性(我绘制跨语言域类)
所以我必须用简单数组..映射一个简单的数组

我想NHibernate的在两者之间建立一个连接表类,
这些领域类:

public class ClassOne 
    { 
     public virtual Guid Guid { get; set; } 
     public virtual String Title { get; set; } 
     public virtual ClassTwo[] Tags { get; set; } 
    } 

    public class ClassTwo 
    { 
     public virtual Guid Guid { get; set; } 
     public virtual string Title { get; set; } 
    } 

这是地图:

public class ClassOneMap : ClassMap<ClassOneMap> 
    { 
     public ClassOneMap() 
     { 
      Id(x => x.Guid).GeneratedBy.GuidComb(); 
      Map(x => x.Title); 
      HasManyToMany(x => x.Tags) 
       .Cascade.SaveUpdate()); 

     } 
    } 

    public class ClassTwoMap : ClassMap<ClassTwo> 
    { 
     public ClassTwoMap() 
     { 
      Id(x => x.Guid).GeneratedBy.GuidComb(); 
      Map(x => x.Title); 
     } 
    } 

的架构生成伟大!它有一个ClassOne,ClassTwo和ClassTwoToClassOne表 但是,当我试图坚持一个ClassOne的实例时,我有一个无效的转换异常.. 这是通过将数组更改为IList的解决,但我不能这样做..

任何人都可以告诉我如何配置Fluent映射使用数组而不更改架构体系结构?

谢谢A'lot!

+0

我很好奇,什么其他您使用的语言不允许IList? – 2010-12-18 19:11:42

回答

2

好的,玩了这个,希望能解决这个问题。

所以型号有:

public class ClassOne : Entity 
    { 
     public virtual string Title { get; set; } 

     public virtual ClassTwo[] Tags { get; set; } 

    } 

    public class ClassTwo : Entity 
    { 
     public virtual string Title { get; set; } 
    } 

基类包含ID定义,是长在我的情况。不应该用的GUID问题

映射类:我们正在使用FluentNhibernate一些惯例,也是这个想法是在HasManyToMany

public class ClassOneMappingOverride : IAutoMappingOverride<ClassOne> 
    { 
     public void Override(AutoMapping<ClassOne> mapping) 
     { 
      mapping.HasManyToMany(x => x.Tags).AsArray(x => x.Id).ParentKeyColumn("classOneId") 
       .ChildKeyColumn("classTwoId") 
       .Table("ClassOneLinkClassTwo") 
       .Cascade.SaveUpdate(); 
     } 
    } 

请注意,如果您不表明ParentKey,ChildKey和表也不会创建链接表。

其中插入数据看起来就像单元测试:

public class ClassOneDataPart : DataPartBase, IDataPart 
{ 
    public void AddToDatabase() 
    { 
     var classOne = new ClassOne { Title = "classOne" }; 

     var classTwo1 = new ClassTwo { Title = "class21" }; 
     var classTwo2 = new ClassTwo { Title = "class22" }; 

     var tags = new[] { classTwo1, classTwo2 }; 

     classOne.Tags = tags; 

     this.SaveData(classOne); 
     this.SaveData(classTwo1); 
     this.SaveData(classTwo2); 
    } 
} 

,结果到数据库:

alt text

问候, 离子

0

尝试使用.AsArray(X => x.Id)

+0

谢谢,但我已经试过..模式生成器将ManyToMany表与ClassTwo表(它拥有所有的数据)..我无法弄清楚为什么.. – 2010-12-18 18:49:32

1

地图的集合作为一个私有字段并将其公开为一个数组。这也使得在不操作数组的情况下公开AddTag和RemoveTag方法变得很容易。

public class ClassOne 
{ 
    private IList<ClassTwo> _tags; 

    public virtual Guid Guid { get; set; } 
    public virtual String Title { get; set; } 
    public virtual ClassTwo[] Tags 
    { 
     // possibly expose as method to hint that the array is re-built on every call 
     get { return _tags.ToArray(); } 
    } 
} 

public class ClassOneMap : ClassMap<ClassOne> 
{ 
    public ClassOneMap() 
    { 
     Id(x => x.Guid).GeneratedBy.GuidComb(); 
     Map(x => x.Title); 
     HasManyToMany(x => x.Tags).Access.CamelCaseField(Prefix.Underscore) 
      .Cascade.SaveUpdate()); 

    } 
}