Reference Key-Value Types
This topic demonstrates how to map a dictionary property with key and value that are reference types.
Below is a sample FluentMetadataSource implementation showing you how to configure the DictionaryModel class. The class has a dictionary property with key and value that are reference types.
public class FluentModelMetadataSource : FluentMetadataSource
{
protected override IList<MappingConfiguration> PrepareMapping()
{
IList<MappingConfiguration> preparedConfigurations = new List<MappingConfiguration>();
MappingConfiguration<KeyClass> keyClassConfig = new MappingConfiguration<KeyClass>();
keyClassConfig.MapType().ToTable( "KeyTable" );
keyClassConfig.HasProperty( x => x.KeyClassId ).IsIdentity( KeyGenerator.Autoinc );
preparedConfigurations.Add( keyClassConfig );
MappingConfiguration<ValueClass> valueClassConfig = new MappingConfiguration<ValueClass>();
valueClassConfig.MapType().ToTable( "ValueTable" );
valueClassConfig.HasProperty( x => x.ValueClassId ).IsIdentity( KeyGenerator.Autoinc );
preparedConfigurations.Add( valueClassConfig );
MappingConfiguration<DictionaryModel> dictionaryConfiguration =
new MappingConfiguration<DictionaryModel>();
dictionaryConfiguration.HasProperty( d => d.Id ).ToColumn( "Id" );
dictionaryConfiguration.HasProperty( d => d.Name ).ToColumn( "Name" );
dictionaryConfiguration.MapType().ToTable( "DictionaryModel" );
dictionaryConfiguration.HasProperty( d => d.Id ).IsIdentity( KeyGenerator.Autoinc );
dictionaryConfiguration.HasAssociation( x => x.KeyValueDictionary ).
MapJoinTable( "JoinTableName", ( x, y, z ) => new
{
x.Id, // The DictionaryModel.Id property
y.KeyClassId,
z.ValueClassId
} );
preparedConfigurations.Add( dictionaryConfiguration );
return preparedConfigurations;
}
}
Public Class FluentModelMetadataSource
Inherits FluentMetadataSource
Protected Overrides Function PrepareMapping() As IList(Of MappingConfiguration)
Dim preparedConfigurations As IList(Of MappingConfiguration) = New List(Of MappingConfiguration)()
Dim keyClassConfig As New MappingConfiguration(Of KeyClass)()
keyClassConfig.MapType().ToTable("KeyTable")
keyClassConfig.FieldNamingRules.AddPrefix = "_"
keyClassConfig.HasProperty(Function(x) x.KeyClassId).IsIdentity(KeyGenerator.Autoinc)
preparedConfigurations.Add(keyClassConfig)
Dim valueClassConfig As New MappingConfiguration(Of ValueClass)()
valueClassConfig.MapType().ToTable("ValueTable")
valueClassConfig.FieldNamingRules.AddPrefix = "_"
valueClassConfig.HasProperty(Function(x) x.ValueClassId).IsIdentity(KeyGenerator.Autoinc)
preparedConfigurations.Add(valueClassConfig)
Dim dictionaryConfiguration As New MappingConfiguration(Of DictionaryModel)()
dictionaryConfiguration.HasProperty(Function(d) d.Id).ToColumn("Id")
dictionaryConfiguration.HasProperty(Function(d) d.Name).ToColumn("Name")
dictionaryConfiguration.MapType().ToTable("DictionaryModel")
dictionaryConfiguration.FieldNamingRules.AddPrefix = "_"
dictionaryConfiguration.HasProperty(Function(d) d.Id).IsIdentity(KeyGenerator.Autoinc)
dictionaryConfiguration.HasAssociation(Of KeyClass, ValueClass)(Function(x) x.KeyValueDictionary).
MapJoinTable("JoinTableName", Function(x, y, z) New With {Key x.Id,
Key y.KeyClassId,
Key z.ValueClassId})
preparedConfigurations.Add(dictionaryConfiguration)
Return preparedConfigurations
End Function
End Class
The resulting database schema should look like the snapshot below:
DictionaryModel Class
public class DictionaryModel
{
public DictionaryModel()
{
this.KeyValueDictionary = new Dictionary<KeyClass, ValueClass>();
}
public int Id {get;set;}
public string Name {get;set;}
public IDictionary<KeyClass, ValueClass> KeyValueDictionary {get;set;}
}
Public Class DictionaryModel
Public Sub New()
Me.KeyValueDictionary = New Dictionary(Of KeyClass, ValueClass)()
End Sub
Private _id As Integer
Public Property Id() As Integer
Get
Return _id
End Get
Set(ByVal value As Integer)
_id = value
End Set
End Property
Private _name As String
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Private _keyValueDictionary As IDictionary(Of KeyClass, ValueClass)
Public Property KeyValueDictionary() As IDictionary(Of KeyClass, ValueClass)
Get
Return _keyValueDictionary
End Get
Set(ByVal value As IDictionary(Of KeyClass, ValueClass))
_keyValueDictionary = value
End Set
End Property
End Class
KeyClass
public class KeyClass
{
public int KeyClassId {get;set;}
public string Name {get;set;}
}
Public Class KeyClass
Private _keyClassId As Integer
Public Property KeyClassId() As Integer
Get
Return _keyClassId
End Get
Set(ByVal value As Integer)
_keyClassId = value
End Set
End Property
Private _name As String
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
End Class
ValueClass
public class ValueClass
{
public int ValueClassId {get;set;}
public string Name {get;set;}
}
Public Class ValueClass
Private _valueClassId As Integer
Public Property ValueClassId() As Integer
Get
Return _valueClassId
End Get
Set(ByVal value As Integer)
_valueClassId = value
End Set
End Property
Private _name As String
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
End Class