Como faço para mapear um dicionário usando o Fluent Nibernate Automapping?
-
20-09-2019 - |
Pergunta
Eu tenho uma entidade assim:
public class Land
{
public virtual IDictionary<string, int> Damages { get; set; }
// and other properties
}
Toda vez que tento usar o Automapping com o seguinte código:
var sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.InMemory)
.Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Land>))
.BuildSessionFactory();
Estou tendo o erro a seguir:
{"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."}
Alguém pode me dizer o que estou fazendo de errado? Além disso, este é apenas um exemplo simples. Eu tenho muito mais dicionários do que apenas este.
Solução
É impossível com Nibernate.
Outras dicas
Encontrei alguns traços que este não é possível. Alguns traços, que Recentemente é implementado.
Ainda investigando. :)
Isso parece bastante promissor (ainda não testou).
Então, no seu caso, deve parecer =>
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>()
);
}
}
Lembre -se - isso deve. Eu não testei.
Uma possível solução alternativa que deve, em teoria, trabalhar com o Automapping:
public class DamagesDictionary : Dictionary<string, int>
{
}
Land.CS
public class Land
{
public virtual DamagesDictionary Damages { get; set; }
// and other properties
}
ou uma abordagem mais genérica ...
public class StringKeyedDictionary<T> : Dictionary<string, T>
{
}
Land.CS
public class Land
{
public virtual StringKeyedDictionary<int> Damages { get; set; }
// and other properties
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow