映射Fluent NHibernate,其中主键也应该是外键

本文关键字:也应该 Fluent NHibernate 映射 | 更新日期: 2023-09-27 18:15:17

我有一个像这样的用户对象:

public class User
{
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    ...
}

这在nhibernate中被流畅地映射:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId).Column("UserId");
        Map(x => x.UserName).Not.Nullable();
        ...
    }
}

我正在尝试构建一个与用户对象分开的凭证块,因此密码和盐不会像这样在用户类中携带:

public class UserCredential
{
    public User User { get; set; }
    public byte[] Password { get; set; }
    public string Salt { get; set; }
}

…但我不知道如何正确地映射它。最终,在数据库中,我希望在UserCredentials表中看到UserId列,它既是Users表的主键,也是外键。Users表应该没有对UserCredentials表的引用。我怎么写ClassMap<UserCredential>类?

映射Fluent NHibernate,其中主键也应该是外键

这似乎是一个one-to-one关系,因此可以在FNH中使用HasOne进行映射。

例子
    public UserCredentialMap()
    {
        Id(x => x.Id)
            .Column("UserId")
            .GeneratedBy.Foreign("User");
        HasOne(x => x.User).Constrained();
    }

你也可以像这样映射它:

public UserCredentialMap()
{
    Id(x => x.Id, "UserId");
    References(x => x.User, "UserId")
            .Not.Update()
            .Not.Insert();
}

因为你不想给Credentials它自己的主键,在我看来,你真正想要的是一个组件(更多细节)。

这将意味着Credential数据存储在与User数据相同的表中,但在您的域中作为单独的对象建模,该对象是您的User类的属性。