2013-03-07 43 views
0

我有困难使用流利NHibernate自动映射我的对象。流利NHibernate的自动映射子类,当基地已经存在于数据库中

我有类调用Document对于该表SQLServer中已经存在。

Packet延伸Document和有一个构件PacketDefinition

PacketDefinitionFormList没有窗户的形式,但我自己的类)型。

enter image description here

我试图自动映射使用以下配置Packet对象。

 var mapping = CreateMappings(); 

     _sessionFactory = Fluently.Configure() 
            .Database(
             MsSqlConfiguration.MsSql2008.ConnectionString(
              c => c.Server("machinename\\sql2012").Database("DatabaseName").TrustedConnection()) 
                 .ShowSql) 
            .Mappings(m => m.AutoMappings.Add(mapping)) 
            .ExposeConfiguration(BuildSchema) 
            .BuildSessionFactory(); 

    private static AutoPersistenceModel CreateMappings() 
    { 
     return AutoMap 
      .AssemblyOf<Packet>(); 
    } 

    private static void BuildSchema(Configuration config) 
    { 
     new SchemaExport(config).Create(false, true); 
    } 

问题是,当我尝试自动映射Packet类,我得到错误说

System.Data.SqlClient.SqlException : There is already an object named 'Document' in the database.

据我所知,Document表已经存在于数据库中,我也不想放弃它。我试着忽略使用

AutoMap.AssemblyOf<Packet>().IgnoreBase<Document>(); 

的基类,但随后在自动映射表Packet创建的Document所有属性太,这是不好的。

如果我创建一个单独的数据库,然后运行一下它的工作原理为Document表相同的代码在数据库中不存在。我不想放弃现有的表格,因为里面有很多数据。

回答

0

如果我理解正确的,你要设法避免跌落文档表,因为“有大量的数据在它”。

我不知道有什么办法做你想做的。 FNH和NH没有任何数据迁移功能(AFAIK),并且我认为当您尝试以这种方式使用它时,您只是在与系统对抗。

如果它只是一个表,也许你可以做一些简单的像出口它像一个CSV文件格式平,然后让FNH重建架构,然后再导入数据。

然而,随着模式的发展,以及变得更复杂了这种方法可能不能很好地扩展。

我的项目,我们可以躲闪这个问题,因为我们第一次保存专有二进制文件,我们的传统程序也可以使用我们的数据,这样我们就可以重新导入我们所有的数据时,我们的架构更改。但这对大多数项目来说并不理想。

+0

感谢您的回复。你是对的,我不想放弃现有的表格,因为它包含很多数据。另外我的数据库模式非常复杂,所以导出数据和重新导入可能会导致很多客户陷入混乱。英孚是否处理这个更好? – Mayank 2013-03-12 15:05:13

+0

我对EF没有经验,但最近读到EF有更好的移植工具。但他们也表示,制图和图式生成几乎不如FNH/NH。也许你应该发布另一个SO问题,询问有关FNH/NH模式生成的数据迁移策略。 – 2013-03-12 15:29:59