2

FNH で次のテーブル/エンティティをマップしようとしていますが、どこにも速くないようです!

**Tables**
Contacts
    ID (PK - int - generated)
    ...

PhoneTypes
    ID (PK - varchar - assigned) (e.g. MOBILE, FAX)

ContactPhones
    ContactRefId    (PK - FK to Contacts)
    PhoneTypeRefId  (PK - FK to PhoneTypes)
    ...

(S#arp アーキテクチャ フレームワークも使用していることに注意してください)

**Entities**
public class Contact : Entity
{
    (The ID property is defined in the Entity base class and is type int)

    public virtual ICollection<ContactPhone> PhoneNumbers { get; set; }
}

public class PhoneType : EntityWithTypedId<string>, IHasAssignedId<string>
{
    (The ID property is defined in the base class and is type string)

    ....
}

public class ContactPhone : EntityWithTypedId<ContactPhoneId>, IHasAssignedId<ContactPhoneId>
{
    public virtual Contact Contact { get; set; }

    public virtual PhoneType PhoneType { get; set; }
    ....
}

複合 ID を使用する場合は、複合 ID を別のクラスに分離することをお勧めします。 ハイバネート複合キー

public class ContactPhoneId : EntityWithTypedId<ContactPhoneId>, IHasAssignedId<ContactPhoneId>
{
    public virtual Contact Contact { get; set; }

    public virtual PhoneType PhoneType { get; set; }
}
...I could just make this class serializable and override 
Equals and GetHashCode myself instead of using the S#arp Arch base class.

私は非常に多くのマッピングの組み合わせを試しましたが、今では完全に混乱しています。

これは私の最新のショットです:

public class ContactMap : IAutoMappingOverride<Contact>
{
    public void Override(AutoMapping<Contact> mapping)
    {
        mapping.HasMany<ContactPhone>(x => x.PhoneNumbers)
            .KeyColumns.Add("ContactRefId")
            .KeyColumns.Add("PhoneTypeRefId")
            .AsSet()
            .Inverse()
            .Cascade.All();
    }
}


public class PhoneTypeMap : IAutoMappingOverride<PhoneType>
{
    public void Override(AutoMapping<PhoneType> mapping)
    {
        mapping.Id(x => x.Id).Column("Id").GeneratedBy.Assigned();
    }
}


public class ContactPhoneMap : IAutoMappingOverride<ContactPhone>
{
    public void Override(AutoMapping<ContactPhone> mapping)
    {
        mapping.Table("ContactPhones");
        mapping.CompositeId<ContactPhoneId>(x => x.Id)
            .KeyReference(y => y.Contact, "ContactRefId")
            .KeyReference(y => y.PhoneType, "PhoneTypeRefId");
    }
}  

マッピングを生成しようとすると、多くの例外がスローされました。最新のものは次のとおりです。

Foreign key (FK672D91AE7F050F12:ContactPhones [ContactRefId, PhoneTypeRefId])) 
must have same number of columns as the referenced primary key (Contacts [Id])

私が間違っていることは明らかですか?私は NH と FNH を初めて使用しますが、これはこの投稿から明らかかもしれません。:-) また、S#arp アーキテクチャを使用しているときに、このような複合 ID を使用した人はいますか? ベストプラクティスは何ですか (代理キーを使用する以外:-))?

どうもありがとうございました...そして長い投稿について申し訳ありません。

4

1 に答える 1

0

私も多対多の関係を持っています。私は次のような私のセットアップを持っています:

mapping.HasManyToMany(x => x.Artists).Cascade.All().Inverse().Table("ArtistImages");

ArtistImages テーブルには、テーブル Artists と Images の主キーがあります。

于 2010-07-06T18:36:37.290 に答える