当数据库中已存在base时,流畅的NHibernate自动化子类

时间:2013-03-07 15:08:19

标签: c# fluent-nhibernate fluent-nhibernate-mapping

我无法使用Fluent NHibernate自动化我的对象。

我有一个名为Document的类,该表已存在于SqlServer中。

班级Packet 延伸 Document并拥有会员PacketDefinition

PacketDefinition有一个List Form不是Windows格式,但我自己的类)类型。

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>();

但随后自动化也会在Document表中创建Packet的所有属性,但这并不好。

如果我创建一个单独的数据库,然后尝试运行相同的代码,那么Document表就不存在于该数据库中。我不想放弃现有的桌子,因为里面有很多数据。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你会试图避免删除你的Document表,因为“其中有很多数据”。

我不知道有什么方法可以做你想做的事。 FNH和NH没有任何数据迁移功能(AFAIK),我认为当你试图以这种方式使用它时,你只是在与系统作斗争。

如果它只是一个表,也许你可以做一些简单的事情,比如将它导出为像CSV文件这样的平面格式,然后让FNH重建模式,然后再次导入数据。

但是,这种方法可能无法很好地扩展,因为您的架构不断发展并变得更加复杂。

在我的项目中,我们能够回避这个问题,因为我们首先将数据保存在我们的遗留程序也使用的专有二进制文件中,因此我们可以在架构更改时重新导入所有数据。但这对大多数项目来说并不理想。