Отображение простого массива - PullRequest
3 голосов
/ 18 декабря 2010

Я использую свободный Nhibernate, чтобы отобразить простой класс
И используя создание схемы для создания этого класса в БД MySQL.
Я не могу использовать 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 для использования массивов без изменения архитектуры схемы?

Спасибо, много!

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Хорошо, поигрался с этим и надеюсь, что решу вопрос.

Итак, модели:

 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, которое в моем случае является длинным. Не должно быть проблем с гидами

Класс отображения: мы используем 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

С уважением, Ion

1 голос
/ 18 декабря 2010

Сопоставить коллекцию как частное поле и представить его в виде массива. Это также упрощает предоставление методов 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());

    }
}
0 голосов
/ 18 декабря 2010

Попробуйте использовать .AsArray (x => x.Id)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...