流畅的映射 - 不同程序集中的实体和类映射

时间:2009-09-03 18:30:56

标签: nhibernate fluent-nhibernate

使用流畅配置指定如下的流畅映射时:

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

目前我收到了“NHibernate.MappingException:No persister for”错误。

我的实体和我的ClassMaps在不同的程序集中是否存在问题?大概AddFromAssembly对包含类映射的程序集感兴趣,而不是实体? (这就是我所假设的)

谢谢!

UPDATE:

很抱歉没有迅速回复答案 - 我在设定赏金后不得不出差。

无论如何,感谢您的回复。我已经浏览了它们并更新了我的代码以使用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

由于

P.S .: 我尝试过使用和AddFromAssemblyOf(); 具有映射定义的项目(DataAccess)引用了具有实体的项目(Model)。

4 个答案:

答案 0 :(得分:5)

您使用的是什么版本的Fluent NHibernate?发布候选版本和1.0发行版本存在问题。您可以考虑从SVN存储库下载最新版本。

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

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

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

另外,我应该提一下,当你使用AddFromAssemblyOf时,fluent将尝试映射该程序集中的每个类。如果您在该命名空间中有任何其他类,则需要对其进行过滤。有几种不同的方法可以实现这一目标。最简单的方法是将所有要映射的POCO放在自己的命名空间中,然后执行以下操作。

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

Where子句将过滤您不想映射的项目。

答案 1 :(得分:4)

  

我的实体和我的ClassMaps在不同的程序集中是否存在问题?

只要您的ClassMap项目对您的实体项目具有参考性,那就没有任何问题

无论如何试试这个:

m.FluentMappings.AddFromAssemblyOf<UserMapping>()

如果在整个错误发布后不起作用

答案 2 :(得分:1)

当然,将你的实体放在不同的集会中不应该导致问题,因为Yassir暗示了上述情况。

根据Fluent NHibernate Wiki,AddFromAssemblyOf方法在包含所有实体的程序集中推断或反映,并在向其提供任何实体名称时映射到它们。从FNH wiki上的文档中,您将构建如下方法:

 m.FluentMappings
  .AddFromAssemblyOf<YourEntity>(); 

因此,在您的示例中,如果您要映射的实体名为User,那么您的代码应按如下方式构造:

 m.FluentMappings
  .AddFromAssemblyOf<User>();

希望这有帮助。

答案 3 :(得分:1)

这已经解决了吗?如果没有,你可以参与你的设置吗?

例如,这是我的例子

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&lt; - 映射文件和Dao(也是hibernate会话管理器,包含上面的代码)
  • project.Core&lt; - POCO's
  • project.UI
如果你有混合的Fluent NHibernate和NHibernate配置,也可以看看here

最后看一下S#arp Architectures的方式,因为我认为它包含了这种混合物

NhibernateSession&lt; - function:private static ISessionFactory CreateSessionFactoryFor

希望这有帮助