0

FluentNHibernateは初めてです。生成されるSQLモデルの「クリーンさ」に細心の注意を払っています。

現在、私はOpenIDベースの認証システムを持っており、各ユーザーを複数のOpenIDに関連付けることができ、個人のパスワードを持っています。エンティティは次のようになります(必須に簡略化)。

public class User
    {
        public virtual long Id { get; set; }
        
        public virtual string EmailAddress { get; set; }

        public virtual IEnumerable<OpenId> OpenIds { get; set; }
    }

public class OpenId
    {
        public virtual Uri Uri { get; set; }

        public virtual User Owner { get; set; }
    }

基本的に、OpenIDから対応するものにOwner、またはその逆にナビゲートしたいと思います。ユーザーが指定された場合、関連付けられたをフェッチしますOpenIds

問題は、生成されたSQLにあります。マッピングは次のとおりです。

internal class UserMapping : ClassMap<User>
{
    public UserMapping()
    {
        Id(x => x.Id);
        Map(x => x.EmailAddress);

        HasMany(x => x.OpenIds)
            .Inverse()
            .AsBag()
            .Cascade.All()
            .LazyLoad()
            .NotFound.Ignore()
            .Fetch.Join();


    }
}

internal class OpenIdMapping : ClassMap<OpenId>
{
    public OpenIdMapping()
    {
        Id(x => x.Uri);

        References(x => x.Owner)
            .Cascade.All()
            .LazyLoad();
    }
}

子エンティティの生成されたSQLは次のようになります

create table `OpenId` (Uri VARCHAR(255) not null, Owner_id BIGINT, User_id BIGINT, primary key (Uri))
alter table `OpenId` add index (Owner_id), add constraint FKA39F7E21DE3E69E4 foreign key (Owner_id) references `User` (Id)
alter table `OpenId` add index (User_id), add constraint FKA39F7E21E052E59D foreign key (User_id) references `User` (Id)

Owner_idと列User_idは冗長なので、両方は必要ありません

一般に

Fluent NHibernateで双方向にナビゲート可能な親子関係を作成するにはどうすればよいですか?冗長な外部キーを回避するにはどうすればよいですか?

4

2 に答える 2

1

アソシエーションの両側で同じ外部キー列を使用していることを確認してください。

HasMany(x => x.OpenIds)
        .KeyColumn("Owner_id")
        .Inverse()
        .AsBag()
        .Cascade.All()
        .LazyLoad()
        .NotFound.Ignore()
        .Fetch.Join()

Referencesステートメントは、カスタム列名を指定するメソッドも提供します。したがって、idサフィックスなしで「Owner」のような列名を使用できます。

于 2013-03-20T20:19:16.997 に答える
0

OwnerプロパティをリファクタリングしてUser引き続き機能する

于 2013-03-21T07:55:11.690 に答える