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で双方向にナビゲート可能な親子関係を作成するにはどうすればよいですか?冗長な外部キーを回避するにはどうすればよいですか?