c# Fluent nHibernate 主键是外键
c# Fluent nHibernate primary key is foreign key
我的数据库布局如下所示:
Users
------------
|UserId | <-PK
|FirstName |
|LastName |
|MiddleName|
|Email |
------------
Admins
------------
|UserId | <-PK/FK to Users
------------
我只是希望能够向管理员输入唯一 ID table 以指定该用户是否为管理员。
这是我的 Fluent nHibernate 代码:
public class Users
{
public virtual string UserId { get; set; }
public virtual string FirstName { get; set; }
....
}
public class UserMappings : ClassMap<Users>
{
public UserMappings()
{
Id(x => x.UserId).Column("UserId").Not.Nullable();
Map(x => x.FirstName).Column("FirstName").Not.Nullable();
Map(x => x.MiddleName).Column("MiddleName").Nullable();
....
}
}
public class Admins
{
public virtual Users User { get; set; }
}
public class AdminMappings : ClassMap<Admins>
{
public AdminMappings()
{
Id(x => x.User).GeneratedBy.Foreign("Users");
HasOne(x => x.User).Constrained();
}
}
不幸的是,当我 运行 时,我得到这个错误:
Could not determine type for: SMAC.Users, SMAC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(User)
我想要的是如果我这样做:
var admin;
admin.user <= instance of user to get name, email, etc...
我将如何着手完成这项工作?
编辑:我添加了这个并且我让它工作了,虽然我不知道它是否理想:
public AdminMappings()
{
Id(x => x.UserId).Column("UserId");
HasOne(x => x.User).Constrained();
}
public UserMappings()
{
Id(x => x.UserId).Column("UserId").Not.Nullable();
Map(x => x.FirstName).Column("FirstName").Not.Nullable();
Map(x => x.MiddleName).Column("MiddleName").Nullable();
...
HasOne(x => x.Admin).Cascade.All();
}
public class Admins
{
public virtual string UserId { get; set; }
public virtual Users User { get; set; }
}
public class Users
{
public virtual string UserId { get; set; }
public virtual string FirstName { get; set; }
....
public virtual Admins Admin { get; set; }
}
唯一需要注意的是,我必须实际设置 UserId 和 User 才能保存 Admin 记录,而不仅仅是 UserId 并让它自动为我提取 User 记录。
NHibernate 可以处理主键中的 FK
public class AdminMappings : ClassMap<Admins>
{
public AdminMappings()
{
CompositeId().KeyReference(x => x.User, "UserId");
}
}
不要忘记在 Admin 上适当地实施 equals 和 gethashcode 以使用 User.Id
更新:
要保存具有给定用户 ID 的管理员记录,您可以使用 session.Load<Users>(userId)
,它不会立即加载用户记录,但会满足引用。
我的数据库布局如下所示:
Users
------------
|UserId | <-PK
|FirstName |
|LastName |
|MiddleName|
|Email |
------------
Admins
------------
|UserId | <-PK/FK to Users
------------
我只是希望能够向管理员输入唯一 ID table 以指定该用户是否为管理员。
这是我的 Fluent nHibernate 代码:
public class Users
{
public virtual string UserId { get; set; }
public virtual string FirstName { get; set; }
....
}
public class UserMappings : ClassMap<Users>
{
public UserMappings()
{
Id(x => x.UserId).Column("UserId").Not.Nullable();
Map(x => x.FirstName).Column("FirstName").Not.Nullable();
Map(x => x.MiddleName).Column("MiddleName").Nullable();
....
}
}
public class Admins
{
public virtual Users User { get; set; }
}
public class AdminMappings : ClassMap<Admins>
{
public AdminMappings()
{
Id(x => x.User).GeneratedBy.Foreign("Users");
HasOne(x => x.User).Constrained();
}
}
不幸的是,当我 运行 时,我得到这个错误:
Could not determine type for: SMAC.Users, SMAC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(User)
我想要的是如果我这样做:
var admin;
admin.user <= instance of user to get name, email, etc...
我将如何着手完成这项工作?
编辑:我添加了这个并且我让它工作了,虽然我不知道它是否理想:
public AdminMappings()
{
Id(x => x.UserId).Column("UserId");
HasOne(x => x.User).Constrained();
}
public UserMappings()
{
Id(x => x.UserId).Column("UserId").Not.Nullable();
Map(x => x.FirstName).Column("FirstName").Not.Nullable();
Map(x => x.MiddleName).Column("MiddleName").Nullable();
...
HasOne(x => x.Admin).Cascade.All();
}
public class Admins
{
public virtual string UserId { get; set; }
public virtual Users User { get; set; }
}
public class Users
{
public virtual string UserId { get; set; }
public virtual string FirstName { get; set; }
....
public virtual Admins Admin { get; set; }
}
唯一需要注意的是,我必须实际设置 UserId 和 User 才能保存 Admin 记录,而不仅仅是 UserId 并让它自动为我提取 User 记录。
NHibernate 可以处理主键中的 FK
public class AdminMappings : ClassMap<Admins>
{
public AdminMappings()
{
CompositeId().KeyReference(x => x.User, "UserId");
}
}
不要忘记在 Admin 上适当地实施 equals 和 gethashcode 以使用 User.Id
更新:
要保存具有给定用户 ID 的管理员记录,您可以使用 session.Load<Users>(userId)
,它不会立即加载用户记录,但会满足引用。