映射一个简单的数组

时间:2010-12-18 17:22:01

标签: c# mysql nhibernate fluent-nhibernate

我正在使用流利的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!

3 个答案:

答案 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);
    }
}

,结果进入数据库:

alt text

此致 离子

答案 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)

相关问题