我正在使用流利的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的一个实例时,我有一个Invalid Cast异常.. 这可以通过将数组更改为IList来解决,但我不能真的这样做..
有谁能告诉我如何在不改变架构架构的情况下配置Fluent映射以使用Arrays?
谢谢A'lot!
答案 0 :(得分: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定义,在我的情况下很长。 Guids不应该是一个问题
映射类:我们正在使用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和Table,则不会创建链接表。
插入数据的单元测试如下:
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);
}
}
,结果进入数据库:
此致 离子
答案 1 :(得分: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());
}
}
答案 2 :(得分:0)
尝试使用.AsArray(x =&gt; x.Id)