Как мне сопоставить словарь, используя автоматическое отображение Fluent NHibernate? - PullRequest
2 голосов
/ 22 декабря 2009

У меня есть такая сущность:

public class Land
{
    public virtual IDictionary<string, int> Damages { get; set; }
    // and other properties
}

Каждый раз, когда я пытаюсь использовать автоматическое сопоставление со следующим кодом:

var sessionFactory = Fluently.Configure()
    .Database(SQLiteConfiguration.Standard.InMemory)
    .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Land>))
    .BuildSessionFactory();

Я получаю следующую ошибку:

{"The type or method has 2 generic parameter(s), but 1 generic argument(s) were
provided. A generic argument must be provided for each generic parameter."}

Может кто-нибудь сказать мне, что я делаю не так? Кроме того, это всего лишь простой пример. У меня гораздо больше словарей, чем только этот.

Ответы [ 3 ]

9 голосов
/ 30 декабря 2009

Это невозможно с NHibernate.

3 голосов
/ 24 декабря 2009

Найдены следы, что это невозможно . Некоторые следы, что это недавно реализовано .

Продолжает расследование. :)


Это выглядит довольно многообещающе (еще не тестировал).

Итак, в вашем случае это должно выглядеть так =>

public class LandMap : ClassMap<Land>
{
    public LandMap()
    {
        (...)

        HasMany(x => x.Damages)
            .WithTableName("Damages")
            .KeyColumnNames.Add("LandId")
            .Cascade.All()
            .AsMap<string>(
                index => index.WithColumn("DamageType").WithType<string>(),
                element => element.WithColumn("Amount").WithType<int>()
            );
    }
}

Имейте в виду - это должно . Я не проверял это.

1 голос
/ 29 сентября 2010

Возможный обходной путь, который теоретически должен работать с автомаппингом:

public class DamagesDictionary : Dictionary<string, int>
{
}

Land.cs

public class Land
{
   public virtual DamagesDictionary Damages { get; set; }
   // and other properties
}

или более общий подход ...

public class StringKeyedDictionary<T> : Dictionary<string, T>
{
}

Land.cs

public class Land
{
   public virtual StringKeyedDictionary<int> Damages { get; set; }
   // and other properties
}
...