簡體   English   中英

數據庫中已經存在基礎時,會使用Fluent NHibernate自動映射子類

[英]Fluent NHibernate automapping child class when base already exists in database

我在使用Fluent NHibernate自動映射對象時遇到困難。

我有一個名為Document類,該表已經存在於SqlServer中。

Packet 擴展 Document並具有成員PacketDefinition

PacketDefinition有一個ListForm而不是Windows形式,但我自己的類 )類型。

在此處輸入圖片說明

我正在嘗試使用以下配置自動映射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 Table中創建Document所有屬性,這不好。

如果我創建了一個單獨的數據庫,然后嘗試運行相同的代碼,則該Document將起作用,因為該數據庫中不存在Document表。 我不想刪除現有表,因為其中有很多數據。

如果我理解正確,則您嘗試避免刪除“文檔”表,因為“其中有很多數據”。

我不知道您要做什么。 FNH和NH沒有任何數據遷移功能(AFAIK),當您嘗試以這種方式使用它時,我認為您只是在與系統作斗爭。

如果只是一張表,也許您可​​以做一些簡單的事情,例如將其導出為CSV文件等平面格式,然后讓FNH重建架構,然后再次導入數據。

但是,隨着模式的發展和變得越來越復雜,這種方法可能無法很好地擴展。

在我的項目中,我們能夠避免這個問題,因為我們先將數據保存在舊程序也使用的專有二進制文件中,因此我們可以在架構更改時重新導入所有數據。 但這對於大多數項目來說並不理想。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM