如何在Fluent Mapping中处理没有db表的基类?

时间:2016-02-15 06:22:51

标签: c# nhibernate fluent-nhibernate asp.net-identity

我正在尝试使用NHibernate实现AspNet Identity的持久层,例如UserStore等。

我有所有持久性类,即UserClaim映射。但是当我尝试运行项目时,我收到的错误如下:

  

关联引用未映射的类:   Core.AspNet.Identity.NHibernate.IdentityUserClaim

我怀疑这是因为我声明了public partial class Userclaim : IdentityUserClaim,但是IdentityUserClaim不应该有一个表,也许是某种空映射,但我只是不知道。

我当前的映射如下:

public partial class UserclaimMap : ClassMap<Userclaim>
{
    public UserclaimMap()
    {
        Table("UserClaim");
        Id(x => x.Id).Column("Id");
        References(x => x.AgentUser).Column("UserId");
        Map(x => x.DateCreated).Column("DateCreated").Not.Nullable();
        Map(x => x.DateUpdated).Column("DateUpdated").Not.Nullable();
        Map(x => x.ClaimType).Column("ClaimType").Not.Nullable();
        Map(x => x.ClaimValue).Column("ClaimValue");
    }
}

2 个答案:

答案 0 :(得分:0)

我怀疑你的User类引用了这个类。你必须告诉他,它实际上是你的UserClaim类。

public UserMap()
{
    HasMany<UserClaim>(x => x.Claims);
}

答案 1 :(得分:0)

你可以用,

AutoMap.AssemblyOf<Entity>()
  .IgnoreBase<Entity>()

在会话工厂中忽略基类

参考: Fluent NHibernate: How to tell it not to map a base class

修改

我做了一个简短的测试,好像你没有超级类NHibernate的类映射实际上忽略它,我添加了以下类和映射

    public class IdentityUserClaim
    {
        public virtual string Name { get; set; }
    }

    public class Userclaim : IdentityUserClaim
    {
        public virtual int Id { get; set; }

        public virtual DateTime DateCreated { get; set; }

        public virtual DateTime DateUpdated { get; set; }

        public virtual string ClaimType { get; set; }

        public virtual string ClaimValue { get; set; }
    }

    public partial class UserclaimMap : ClassMap<Userclaim>
    {
        public UserclaimMap()
        {
            Table("UserClaim");
            Id(x => x.Id).Column("Id");
            Map(x => x.DateCreated).Column("DateCreated").Not.Nullable();
            Map(x => x.DateUpdated).Column("DateUpdated").Not.Nullable();
            Map(x => x.ClaimType).Column("ClaimType").Not.Nullable();
            Map(x => x.ClaimValue).Column("ClaimValue");
        }
    }

和会话工厂是,

private FluentConfiguration CreateConfiguration(IPersistenceConfigurer configurer)
        {
            return Fluently.Configure()
                .Database(configurer)
                .Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Userclaim>())
                .ExposeConfiguration(x => x.SetInterceptor(new SqlStatementInterceptor()));
        }

        private IPersistenceConfigurer CreateTestDatabaseConfiguration()
        {
            return SQLiteConfiguration
                .Standard
                .InMemory()
                .ShowSql();
        }

所以看起来问题出现在其他一些映射中,可能是因为类映射引用了超类IdentityUserClaim而不是UserClaim。