0

我在使用 Fluent NHibernate 自动映射我的对象时遇到了困难。

我已经调用Document了表已经存在于 SqlServer 中的类。

Packet 扩展 Document并拥有一个成员PacketDefinition

PacketDefinition有一个List不是windows窗体,而是我自己的类Form)类型。

在此处输入图像描述

我正在尝试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>();

但是随后自动映射也会创建Documentin Packettable 的所有属性,这并不好。

如果我创建一个单独的数据库,然后尝试运行相同的代码,它的工作原理是Document该数据库中不存在表。我不想删除现有表,因为其中有很多数据。

4

1 回答 1

0

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

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

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

但是,随着架构的发展和变得更加复杂,这种方法可能无法很好地扩展。

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

于 2013-03-12T15:01:21.243 回答