流利的映射 - 实体和classmaps在不同的组件(Fluent mapping - entiti

2019-08-03 15:11发布

当使用流利的配置,以指定流利的映射是这样的:

.Mappings(m => m.FluentMappings.AddFromAssembly(typeof(UserMapping).Assembly))

目前,我得到一个“NHibernate.MappingException:没有留存的”错误。

它是一个问题,我的实体和我ClassMaps在不同的组件? 想必AddFromAssembly有兴趣持有类映射,而不是实体组件? (这是我假定的)

谢谢!

更新:

对不起,没有回应的答案非常快 - 我必须设置赏金后意外旅行。

无论如何,感谢您的答复。 我已经采取通过他们一看,已经更新了我的代码使用AddFromAssemblyOf而非AddFromAssembly,但我仍然得到同样的错误。 也许我在做一些愚蠢的事。 下面是我使用的会话工厂代码的完整代码:

public class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    var mysqlConfig = FluentNHibernate.Cfg.Db.MySQLConfiguration
                        .Standard
                        .ConnectionString("CONNECTION STRING OMITTED")
                        .UseOuterJoin()
                        .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");

                    _sessionFactory = FluentNHibernate.Cfg.Fluently.Configure()
                                        .Database(mysqlConfig)
                                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>())
                                        .BuildSessionFactory();


                }

                return _sessionFactory;
            }
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }

我收到试图运行在NUnit的一个测试,利用使用该会话机制的仓库时此异常:

NHibernate.MappingException:没有留存为:xxxx.Model.Entities.User

谢谢

PS:我同时使用和AddFromAssemblyOf()审判; 项目与映射定义(数据访问),具有一定的参考与实体(模型)项目。

Answer 1:

您正在使用什么版本的功能NHibernate的? 目前已与候选版本和1.0版本的版本问题。 你可能要考虑从SVN存储库下载最新版本。

http://fluent-nhibernate.googlecode.com/svn/trunk/

此外,您可能要检查的连接字符串,以确保它是完全正确的,并且要确保“用户”下面点的一类。

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>())

另外,我要指出的是,当您使用AddFromAssemblyOf,流畅的将尝试每个类映射在装配。 如果在该命名空间中的其他类,你会想过滤。 有几种不同的方式来实现这一目标。 最简单的方法是只把所有的波苏斯的要在自己的命名空间映射,然后像做以下。

.Mappings(m => m.AutoMappings
                .Add(AutoMap.AssemblyOf<MyNamespace.Entities.MyClass>()
                .Where(type => type.Namespace == "MyNamespace.Entities")

WHERE子句将筛选你不想被映射的项目。



Answer 2:

它是一个问题,我的实体和我ClassMaps在不同的组件?

没有有什么不妥,只要你类映射项目已refrerence到您的实体项目

反正试试这个:

m.FluentMappings.AddFromAssemblyOf<UserMapping>()

如果不交的整个工作错误



Answer 3:

当然,作为亚瑟尔暗示上方具有在不同的装配您的实体应该不会造成问题。

按照功能NHibernate维基AddFromAssemblyOf方法推断或在包含所有的实体,当你提供任何实体名称,它都将映射到它们大会反映。 从上FNH维基文档您可以按如下构建方法:

 m.FluentMappings
  .AddFromAssemblyOf<YourEntity>(); 

因此,在你的榜样,如果你映射实体被命名为用户那么你的代码应该构造如下:

 m.FluentMappings
  .AddFromAssemblyOf<User>();

希望这是帮助。



Answer 4:

这已得到解决? 如果没有,你可以inlcude您的设置?

例如这里是我的一个例子

public static ISessionFactory GetSessionFactory()
    {
        //Old way, uses HBM files only
        //return (new Configuration()).Configure().BuildSessionFactory(); //requies the XMl file.

        //get database settings.
        Configuration cfg = new Configuration();//.Configure();

        ft = Fluently.Configure(cfg);

        //DbConnection by fluent
        ft.Database
            (
            MsSqlConfiguration
                .MsSql2005
                .ConnectionString(c => c
                   .Server(".\\SqlExpress")
                   .Database("NhibTest")
                   .TrustedConnection()
                )
                .ShowSql()
                .UseReflectionOptimizer()
            );

        //set up the proxy engine
        //cfg.Properties.Add("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");

        //get mapping files.
        ft.Mappings(m =>
             {
                 //set up the mapping locations
                 m.FluentMappings.AddFromAssemblyOf<PersonMap>();//.ExportTo("C:\\mappingfiles");
                 //m.Apply(cfg);
             });

        //return the SessionFactory
        return ft.BuildSessionFactory();
    }

项目结构如下:

  • project.Data < - 映射文件,和道的(也冬眠会话管理器,包含上述代码)
  • project.Core < - POCO的
  • project.UI

也有看这里柜面你有功能NHibernate和NHibernate配置的混合物

最后看看处为#ARP架构的方式,因为我认为它包含这种混合物

NhibernateSession < -功能: private static ISessionFactory CreateSessionFactoryFor

希望这可以帮助



文章来源: Fluent mapping - entities and classmaps in different assemblies