簡體   English   中英

NHibernate映射:將層次結構保存到單個表而不帶鑒別器

[英]NHibernate Mapping: Save hierarchy to single table without discriminator

我有一個非常可擴展的模塊化應用程序。 我想從其他程序集擴展映射的Entites。 然而,我仍然需要對基類進行操作。

例:

程序集A中的父類映射:

    public class PersonMap : ClassMap<Person> 
    {
        public PersonMap()
        {
            Table("Persons");

            Id(x => x.Id).GeneratedBy.Assigned();
        }
}

程序集B中的子類映射:

public class EmployeeMap : SubclassMap<Employee>
{
    public EmployeeMap()
    {
        Table("Persons");
        Extends(typeof(Person));

        KeyColumn("Id");

        LazyLoad();

        HasMany<Assignments>(x => x.Assignments).KeyColumn("Id").Inverse().Cascade.AllDeleteOrphan().LazyLoad().NotFound.Ignore();
    }
}

現在每當我在Assembly A的一些代碼中創建Person時,它就被NHibernate保存為Employee。 每當我保存一個Person並嘗試在Assembly A中刷新它時,由於代理會導致類轉換異常。程序集A必須不依賴於程序集B.

我需要在程序集A的所有方法中對父類進行操作。子類僅用於其他程序集。

我該如何映射這樣的東西? 我如何告訴NHibernate將它保存為父類? 我使用SaveOrUpdate來持久保存實體; 如何正確擴展實體,然后將它們保存到同一個表中而沒有鑒別器? NHibernate不能按對象類型區分嗎? 有解決方法嗎?

我不想指定手動代理,因為我必須為每個實體創建代理! 由於依賴性問題,我無法使用訪問者模式。

我需要一種方法來擴展不同程序集中的映射實體而不會出現這樣的問題! 數據庫是遺留的,我無法改變它。 你會如何解決這個問題?

將層次結構映射到單個表而沒有鑒別器的目標是一個難題。 數據層中必須有SOMETHING,它為DAL提供了一條特定記錄是員工而不僅僅是人員的線索。 由於您沒有在員工的Persons表上映射任何其他字段,並且沒有提供鑒別器,因此沒有任何關於Persons表的單個記錄可以區分人員和派生更多的Employees。

您能提供用於檢索人員記錄的代碼嗎? 根據我的經驗,NHibernate查詢幾乎總是需要域類型來保持水合。 在這種情況下,NHibernate可能會嘗試創建它知道的派生類型最多的對象,並且由於它無法區分基本Person和派生的Employee之間的區別,因此所有人員都是Employees。 您可以嘗試Linq,它強制強類型對象水合,而不是HQL或其他不太強烈引用的查詢。

通過在同一個表上使用HasOne映射而不使用子類來解決它。 這不會產生理想的代碼,但是沒有問題。

暫無
暫無

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

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