Список интерфейсов Fluent Nhibernate

Я пытаюсь реализовать интерфейс из другого проекта и сохранить его в базе данных, используя свободный nhibernate. Я понял, как сохранить единственный экземпляр интерфейса, но не могу понять, как сделать весь список.

Мои определения классов следующие:

открытый интерфейс IRunnable {int Velocity {получить; набор; } int GetSpeed ​​(); }

public class Person : IRunnable
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    //public virtual IList<Car> Cars { get; set; }

    public Person()
    {
        //this.Cars = new List<Car>();
    }

    public virtual int GetSpeed()
    {
        return -1;
    }

    public virtual int Velocity { get; set; }
}

public class Person1 : IRunnable
{
    public virtual int Id { get; set; }
    public virtual int Age { get; set; }
    public virtual int Velocity { get; set; }

    public virtual int GetSpeed()
    {
        return 0;
    }
}

public class Car
{
    public virtual int Id { get; set; }
    public virtual IRunnable Runnable { get; set; }

    public virtual IList<IRunnable> Runnables { get; set; }

    public Car()
    {
        Runnables = new List<IRunnable>();
    }
}

Определения картографии

 public class Person1Map : ClassMap<Person1>
{
    public Person1Map()
    {
        Id(x => x.Id);
        Map(x => x.Age);
        Map(x => x.Velocity);
    }
}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Velocity);
        //HasMany(x => x.Cars).Cascade.All();
    }
}

public class CarMap : ClassMap<Car>
{
    public CarMap()
    {
        Id(x => x.Id);

        ReferencesAny<IRunnable>(x => x.Runnable)
            .IdentityType<int>()
            .EntityTypeColumn("RunnableType")
            .EntityIdentifierColumn("RunnableId")
            .AddMetaValue<Person>("P")
            .AddMetaValue<Person1>("P1")
            .Cascade.All();

        HasMany(x => x.Runnables)
            .KeyColumn("RunnableId")
            .Cascade
            .All();

    }
}

Ссылки Any отлично подходят для отдельного экземпляра интерфейса, как я могу использовать что-то подобное, когда у меня есть полный список интерфейса?

Спасибо!


person joshwl2003    schedule 06.01.2014    source источник


Ответы (2)


Ответ для свободного использования NHibernate находится здесь: https://github.com/jagregory/fluent-nhibernate/issues/56, отрывок:

Многосторонняя поддержка

Мы до сих пор не поддерживаем "многие к любому"

Как работает «многие ко всем», можно подробно изучить здесь: Ayende, отображение NHibernate, многие-к-любому

Но наиболее важную информацию можно найти здесь: 6.10. Гетерогенные ассоциации

Элементы <many-to-any> и <index-many-to-any> обеспечивают истинно разнородные ассоциации. Эти элементы сопоставления работают так же, как элемент - и их также следует использовать редко, если вообще.

ПРИМЕЧАНИЕ: Пожалуйста, попробуйте переосмыслить вашу модель. Мой опыт показывает, что упрощение с любой точки зрения, кроме краткой, побеждает. Другими словами, если у нас есть такой класс, как Tag, на который можно ссылаться практически где угодно ... обычно мы не вводим IList<A> A, IList<B> B .. в сам Tag. Но мы все еще можем найти теги, связанные с A ... с некоторыми запросами

person Radim Köhler    schedule 07.01.2014
comment
Используя вашу заметку, как бы вы смоделировали класс автомобилей, который я обозначил? Меня смущает это утверждение, обычно мы не вводим IList ‹A› A, IList ‹B› B .. в сам тег. - person joshwl2003; 07.01.2014
comment
Во-первых, если возможно, я бы не стал сопоставлять IRunnable с автомобилем ... если возможно. Если бы мне понадобилось, чтобы Автомобиль использовал материал IRunnable в качестве коллекций, я бы отобразил его как несколько списков (т. Е. В противоположность моему ПРИМЕЧАНИЕ). Я бы ввел столько сопоставлений, сколько настойчивых разработчиков. IList<Person> Persons в качестве первой коллекции и IList<Person1> Person1s ... На верхних уровнях я могу опубликовать несколько виртуальных объединений из них, но во время запросов я бы использовал явные объекты, а не <any>. Резюме, до сих пор никогда не использовал <any>. Либо нет сопоставления, либо явное сопоставление разработчика - person Radim Köhler; 07.01.2014

HasMany с интерфейсами не так просто, или, скажем так, имеет некоторые ограничения.

То, как работает наследование, немного зависит от вашей стратегии отображения. Документацию можно найти здесь.

И вы можете найти хороший пост уже об этом здесь ...

В принципе, вам может потребоваться добавить карту классов для вашего интерфейса и создать сопоставления подклассов для ваших реализаций. Это будет таблица для конкретного сопоставления классов, которая должна работать нормально.

person MichaC    schedule 06.01.2014