gpt4 book ai didi

c# - Fluent NHibernate Collection Table-Per-Subclass

转载 作者:行者123 更新时间:2023-11-30 12:16:06 25 4
gpt4 key购买 nike

我在 Fluent NHibernate 中遇到继承问题。

我之前已经设法让 Table-Per-Subclass 工作,但我无法让基类的集合工作。它正在寻找我没有的基类表。

这是我的架构:

User(Id, Name, Email)

User_Account_Password(Id, UserId, PasswordHash, Salt)

User_Account_Facebook(Id, UserId, FacebookId)

这是我的对象模型:

public class User
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Email { get; set; }
public virtual IList<UserAccount> Accounts { get; set; }
}

public abstract class UserAccount
{
public virtual int Id { get; set; }
public virtual User User { get; set; }
}

public class UserAccountPassword : UserAccount
{
public virtual string PasswordHash { get; set; }
public virtual string Salt { get; set; }
}

public class UserAccountFacebook : UserAccount
{
public virtual long FacebookId { get; set; }
}

这是映射文件:

public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("user");

Id(x=>x.Id);

Map(x=>x.Name);
Map(x=>x.Email);

//This is the collection I am having trouble with.
HasMany(x=>x.Accounts)
.KeyColumn("UserId")
.Cascade.SaveUpdate()
.Not.LazyLoad();
}
}

public class UserAccountMap : ClassMap<UserAccount>
{
public UserAccountMap()
{
Id(x=>x.Id);

References(x => x.User)
.Column("UserId");
}
}

public class UserAccountPasswordMap : SubclassMap<UserAccountPassword>
{
public UserAccountPasswordMap()
{
Table("user_account_password");

Map(x=>x.PasswordHash);
Map(x=>x.Salt);
}
}

public class UserAccountFacebookMap : SubclassMap<UserAccountFacebook>
{
public UserAccountFacebookMap()
{
Table("user_account_facebook");

Map(x=>x.FacebookId);
}
}

如果我的用户有一组 Facebook 帐户和一组密码帐户,这会很好用。然而,我们的想法是将这些链接指向用户,这样我们以后就可以允许人们不使用 facebook 或将 facebook 添加为登录方法但保留相同的帐户。

我收到的错误是“表 myschema.useraccount”不存在。这表明它忽略了 UserAccount 是抽象的事实。

这似乎是根据 http://wiki.fluentnhibernate.org/Fluent_mapping#Subclasses 推荐的执行每个子类表的方法但感觉好像我错过了什么。

有什么想法吗?

最佳答案

Table-per-subclass 是一个反直觉的名称,因为基类(或父类(super class))也需要一个表(参见 NH documentation )。如果 useraccount 表不存在,NH 会像您的情况一样抛出异常。

如果您使用遗留数据库并且基类表不可用,那么您可以使用 table-per-concrete-class或者所谓的联合子类映射:

public class UserAccountMap : ClassMap<UserAccount>
{
public UserAccountMap()
{
Id(x => x.Id).GeneratedBy.Assigned(); // cannot use identity generator with union-subclass mapping

References(x => x.User)
.Column("UserId");

this.UseUnionSubclassForInheritanceMapping(); // tell FNH that you are using table per concrete class mapping
}
}

编辑:UserAccount 表必须存在于数据库架构中才能使用每个子类的表映射。该表必须包含两列:Id 和 UserId。

关于c# - Fluent NHibernate Collection Table-Per-Subclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com