0

我是 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_idUser_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 后缀的列名,如“所有者”。

于 2013-03-20T20:19:16.997 回答
0

重构Owner属性User仍然有效

于 2013-03-21T07:55:11.690 回答