我是 Fluent NHibernate 的新手。我非常关注它生成的 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 中创建双向导航的父子关系?如何避免多余的外键?