2011-08-15 9 views
2

多対多リレーションシップを持つPersonクラスとAddressクラスをマップしようとしています。私はアドレスコレクションをIDictionaryとしてAddressプロパティの型をキーとしてマップしたいと思います。この関係はPerson側からのみマップされます。多対多リレーションシップをIDictionaryとしてマッピングする

public class Person 
{ 
    public IDictionary<int, Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int Type { get; set; } 
} 

私が使用していますマッピングです:問題は、発行されたSQLがあるということである

HasManyToMany<Address>(x => x.Addresses).Table("PersonAddress") 
    .ParentKeyColumn("PersonId").ChildKeyColumn("AddressId") 
    .AsMap(x => x.Type); 

SELECT addressesd0_.PersonId as PersonId1_, 
    addressesd0_.AddressId  as AddressId1_, 
    addressesd0_.Type   as Type1_, 
    address1_.AddressId   as AddressId5_0_ 
    -- etc. 
FROM dbo.PersonAddress addressesd0_ 
    left outer join dbo.Address address1_ 
    on addressesd0_.AddressId = address1_.AddressId 
WHERE addressesd0_.PersonId = 420893 

それからタイプを選択しようとしています多対多の参加テーブルは存在しません。私は、成功せずにマッピングのいくつかのバリエーションを試しました。

どうすればマップできますか?

答えて

5

それは不可能です。辞書には、リレーショナル表にキー値が必要です。あなたが持っているテーブル構造は単純な多対多のバッグまたはセットです。私はどうなるのか

、通常のバッグとして、それをマッピングしたり設定し、エンティティにアクセスのような辞書を提供している:返信用

public class Person 
{ 
    private IList<Address> addresses; 

    public IEnumerable<Address> Addresses { get { return addresses; } } 

    public Address GetAddressOfType(int addressType) 
    { 
     return addresses.FirstOrDefault(x => x.Type == addressType); 
    } 

    public void SetAddress(Address address) 
    { 
     var existing = GetAddressOfType(address.Type); 
     if (existing != null) 
     { 
     addresses.Remove(existing); 
     } 
     addresses.Add(address); 
    } 
} 
+0

これは残念です。とにかく私はあなたが提案したものに似た何かをやってしまいました。 –

0

あなたは、コンポーネントを使用する必要があります。

HasMany<Address>(x => x.Addresses) 
       .AsMap<int>("FieldKey") 
       .Component(x => x.Map(c => c.Id)); 
+0

おかげしかし、これは動作しません。生成されるSQLは、PersonId0_としてaddressesd0_.PersonIdを選択 'AddressId0_として addressesd0_.AddressIdある、dbo.PersonAddress FROM Type0_ としてaddressesd0_.Typeは addressesd0_.PersonId = 420893'をaddressesd0_。アドレステーブルはクエリにはまったく含まれていないことに注意してください。 –

関連する問題