C# 映射简单数组

C# 映射简单数组,c#,mysql,nhibernate,fluent-nhibernate,C#,Mysql,Nhibernate,Fluent Nhibernate,我正在使用fluent Nhibernate映射一个简单的类 并使用模式生成在MySQL DB上创建此类。 我无法将IList用于我的属性(我正在映射跨语言域类) 所以我必须使用简单的数组 我希望NHibernate在这两个类之间创建一个连接表, 以下是域类: public class ClassOne { public virtual Guid Guid { get; set; } public virtual String Title { ge

我正在使用fluent Nhibernate映射一个简单的类
并使用模式生成在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);
        }
    }
公共类ClassOneMap:ClassMap
{
公共ClassOneMap()
{
Id(x=>x.Guid).GeneratedBy.GuidComb();
地图(x=>x.Title);
HasManyToMany(x=>x.Tags)
.Cascade.SaveUpdate());
}
}
公共类ClassTwoMap:ClassMap
{
公共类twomap()
{
Id(x=>x.Guid).GeneratedBy.GuidComb();
地图(x=>x.Title);
}
}
这个模式产生了巨大的影响!它有一个ClassOne、ClassTwo和ClassTwo到ClassOne表 但是当我试图持久化ClassOne的实例时,我遇到了一个无效的强制转换异常。。 这可以通过将数组更改为IList来解决,但我不能真正做到这一点

有人能告诉我如何配置Fluent映射以使用数组而不改变模式架构吗


非常感谢

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

将集合映射为私有字段,并将其公开为数组。这也使得公开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());

    }
}
公共类一
{
私有IList_标签;
公共虚拟Guid Guid{get;set;}
公共虚拟字符串标题{get;set;}
公共虚拟类2[]标记
{
//可能作为方法公开,以提示在每次调用时重新构建数组
获取{return _tags.ToArray();}
}
}
公共类ClassOneMap:ClassMap
{
公共ClassOneMap()
{
Id(x=>x.Guid).GeneratedBy.GuidComb();
地图(x=>x.Title);
HasManyToMany(x=>x.Tags).Access.CamelCaseField(前缀.下划线)
.Cascade.SaveUpdate());
}
}

好的,绕过这个问题,希望能解决这个问题

因此,模型是:

 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不应该有问题

Mapping类:我们使用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();
        }
    }
输入数据库的结果是:

问候,,
Ion

谢谢,但我已经试过了。。模式生成器将ManyToMany表与ClassTwo表放在一起(它保存所有数据)。。我真的不明白为什么..我很好奇,你在用什么其他语言不允许IList?
 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);
    }
}