簡體   English   中英

FluentNHibernate,映射關聯錯誤

[英]FluentNHibernate, Mapping Association Error

對於FluentNHibernate,我的MVC3應用程序在運行時出現以下錯誤,但似乎無法找出映射問題:

表UserRole中的關聯指的是未映射的類:Domain.Entities.User說明:在執行當前Web請求期間發生未處理的異常。 請查看堆棧跟蹤,以獲取有關錯誤及其在代碼中起源的更多信息。

異常詳細信息:NHibernate.MappingException:表UserRole中的關聯引用了未映射的類:Domain.Entities.User

源錯誤:公共ISessionFactory CreateSessionFactory(){返回Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 .ConnectionString(c => c.FromConnectionStringWithKey(“ AppData”))))

兩個相關的類和映射:看不到這里的問題嗎?!

public class User : IUser
{
    public virtual int Id { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Email { get; set; }
    public virtual Guid UserGUID { get; set; }
    public virtual int FileQuota { get; set; }
    public virtual Company Company { get; set; }
    public virtual IList<UserRole> UserRoles { get; set; }
    public virtual IList<CloudFile> CloudFiles { get; set; }
}

public class UserRole : IUserRole
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual User User { get; set; }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.UserName);
        Map(x => x.FirstName);
        Map(x => x.Password);
        Map(x => x.LastName);
        Map(x => x.Email);
        Map(x => x.UserGUID);
        Map(x => x.FileQuota);
        References(x => x.Company);
        HasMany(x => x.UserRoles).Cascade.All();
        HasMany(x => x.CloudFiles).Cascade.All();
    }
}

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name);
        References(x => x.User);
    }
}

有任何想法嗎??

添加我的會話工廠:

    public ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                           .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.UserMap)))
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.CloudFileMap)))
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.CompanyMap)))                               
                           .Mappings(m => m.FluentMappings.Add(typeof(Domain.Mappings.UserRoleMap)))
                           //.ExposeConfiguration(BuildSchema)
                           .BuildSessionFactory();
    }

我認為,當您.Mappings(/*mappings*/)調用.Mappings(/*mappings*/)時,實際上就是在重置映射。

這樣效果更好嗎?

public ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                           .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                           .Mappings(m => 
                           {
                            m.FluentMappings.Add(typeof(Domain.Mappings.UserMap));
                            m.FluentMappings.Add(typeof(Domain.Mappings.CloudFileMap));
                            m.FluentMappings.Add(typeof(Domain.Mappings.CompanyMap));
                            m.FluentMappings.Add(typeof(Domain.Mappings.UserRoleMap));
                           })
                           //.ExposeConfiguration(BuildSchema)
                           .BuildSessionFactory();
    }

我會更改將映射添加到配置中的方式。 Brook的答案是正確的,但是如果您的映射都在同一個程序集中,我將執行以下操作:

public ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
                       .ConnectionString(c => c.FromConnectionStringWithKey("AppData")))
                       .Mappings(m => 
                       {
                        m.FluentMappings.AddFromAssemblyOf<UserMap>()
                       })
                       //.ExposeConfiguration(BuildSchema)
                       .BuildSessionFactory();
}

這樣,您不必在每次創建新映射時都將新映射添加到配置中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM