C# 具有TPC层次结构的对象名称无效

C# 具有TPC层次结构的对象名称无效,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有一个简单的模型: public Store { public virtual Id { get; protected set; } ... public virtual ICollection<UserBase> Users { get; protected set; } } public abstract UserBase { public virtual Id { get; protected set; } public virtua

我有一个简单的模型:

public Store
{
    public virtual Id { get; protected set; }
    ...
    public virtual ICollection<UserBase> Users { get; protected set; }
}

public abstract UserBase
{
    public virtual Id { get; protected set; }
    public virtual string EMail { get; set; }
    public virtual string Password { get; set; }
}

public Customer : UserBase
{
    public virtual string Address { get; set; }
}
公共商店
{
公共虚拟Id{get;protected set;}
...
公共虚拟ICollection用户{get;protected set;}
}
公共抽象用户库
{
公共虚拟Id{get;protected set;}
公共虚拟字符串电子邮件{get;set;}
公共虚拟字符串密码{get;set;}
}
公共客户:用户库
{
公共虚拟字符串地址{get;set;}
}
我有一个流畅的映射:

public class StoreMap : ClassMap<Store>
{
    public StoreMap()
    {
        Id(x => x.Id).GeneratedBy.GuidComb();
        HasMany(x => x.Users).Cascade.AllDeleteOrphan();
    }
}

public class UserBaseMap : ClassMap<UserBase>
{
    public UserBaseMap()
    {
        UseUnionSubclassForInheritanceMapping();

        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.EMail).Not.Nullable();
        Map(x => x.Password).Not.Nullable();
    }
}

public class CustomerMap : SubclassMap<Customer>
{
    public CustomerMap ()
    {
        Abstract();

        Map(x => x.Address).Not.Nullable();
    }
}
公共类存储映射:类映射
{
公共存储地图()
{
Id(x=>x.Id).GeneratedBy.GuidComb();
HasMany(x=>x.Users);
}
}
公共类UserBaseMap:ClassMap
{
公共UserBaseMap()
{
使用UnionSubclass ForInheritanceMapping();
Id(x=>x.Id).GeneratedBy.GuidComb();
Map(x=>x.EMail).Not.Nullable();
Map(x=>x.Password).Not.Nullable();
}
}
公共类CustomerMap:子类映射
{
公共客户映射()
{
抽象();
Map(x=>x.Address).Not.Nullable();
}
}
这是每个具体映射对应一个表的映射,数据库模式按预期生成(没有UserBase表,这很好)

但当我尝试将客户添加到用户集合时:

using (var t = session.BeginTransaction()) {
    var myCustomer = new Customer { EMail = "mail@mail.com", Password = "YouShouldntLookAtThis" };
    var store = GenericRepository.GetById<Store>(RootId);
    store.Users.Add(myCustomer);
    t.Commit();
}
使用(var t=session.BeginTransaction()){
var myCustomer=新客户{电子邮件=”mail@mail.com,Password=“YouShouldntLookAtThis”};
var store=GenericRepository.GetById(RootId);
store.Users.Add(myCustomer);
t、 提交();
}
我得到了以下例外:

Detalles de la execpción:System.Data.SqlClient.SqlException:无效的对象名“UserBase”

我认为这是一个映射问题,但我看不出问题所在。你能帮我弄明白吗?

这是我的5美分

是否可以将Customer类的映射更改为包含tablename


表(“客户”)

你检查过模式了吗?比如在映射中添加这一行:Schema(“dbo”);是的,模式是正确的。我生成的数据库,检索工作的伟大。我只有在尝试将客户添加到UserBase集合时才会遇到这个问题。还有一个选项是use Abstract();在UserBaseClass映射中。也就是说,如果基类不是抽象的,那么需要一个额外的表(上面示例中的USERBASE)来保存超类的实例。