C# 映射主键也应为外键的Fluent NHibernate
我有这样一个用户对象:C# 映射主键也应为外键的Fluent NHibernate,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有这样一个用户对象: 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).Colu
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();
...
}
}
…但我不知道如何正确地映射这个。最后,在数据库中,我希望在
UserCredentials
表中看到一个UserId
列,它既是Users
表的主键,也是外键。Users
表不应引用UserCredentials
表。如何编写ClassMap
类?这似乎是一种一对一的关系,因此将在FNH中使用HasOne
进行映射
例子
您也可以这样映射它:
public UserCredentialMap()
{
Id(x => x.Id, "UserId");
References(x => x.User, "UserId")
.Not.Update()
.Not.Insert();
}
因为你不想给凭证
它自己的主键,所以在我看来,你真正想要的是一个()
这意味着凭证
数据与用户
数据存储在同一个表中,但在您的域中作为单独的对象进行建模,该对象是您的用户类的属性。您可以对此进行扩展吗?我将如何为此编写类映射?HasOne()是否替换Id()?如何将UserId指定为主键和外键?我在上面提供了一个例子。好的,谢谢。。。您指定的Id
属性应该是User
属性,还是意味着我需要在类中为此创建一个新属性?我的意思是您将在UserCredential
中拥有一个Id属性。再看看我的替代映射。那。。。听起来很有趣!我会看看我是否能想出办法让这一切顺利进行。我想这并不能满足我的需要;我不希望从用户
对象外部访问凭据信息。。。我希望仅在凭据对象中管理关系。我能用一个组件做到这一点吗?至少对我来说,这似乎没有意义,为什么凭证
对象拥有用户
,而不是相反?所有权。。。这个词可能不对。这是一件容易接近的事情。我想在类库中管理密码和salt,并传递一个不包含身份验证信息的用户对象。我的成员资格提供者将是唯一访问凭证类的东西(我可能会将其设置为内部)。这有意义吗?凭证对象将只引用一个用户。在数据库设计中,这是此类情况的常见做法,因为当外键受到唯一约束时,创建另一列是没有意义的。在继承模型中也会看到很多这种情况。
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();
}