views:

359

answers:

3

I have an entity like so:

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

Every time I try to use automapping with the following code:

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

I get the following error:

{"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."}

Can someone tell me what I'm doing wrong? Also, this is just a simple example. I have much more dictionaries than just this one.

A: 

Found some traces that this isn't possible. Some traces, that it's recently implemented.

Still investigating. :)


This looks quite promising (didn't test yet).

So, in your case it should look like=>

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>()
            );
    }
}

Keep in mind - it should. I didn't test it.

Arnis L.
That's for fluent mapping. I'm looking for something that works for automapping because I have about 50 dictionaries across all my entities.
Daniel T.
Ahhh... sorry. Somehow didn't notice `automapping`. I'll take a look. :)
Arnis L.
+5  A: 

It is impossible with NHibernate.

Do you mean this to be impossible with Fluent NHibernate automapping, Fluent NHibernate as a whole (meaning with the fluent mappings as well), or NHibernate itself?
Daniel T.
NHibernate itself. I do not know any ORM that could automap dictionary at present moment.
You're right, you have to manually map it. Using Fluent, it'd be `References(x => x.Dictionary).AsMap<int>("keyColumn").Element("valueColumn", c => c.Type<string>());`.
Daniel T.
A: 

A possible workaround that should in theory work with automapping:

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

Land.cs

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

or a more generic approach...

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

Land.cs

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