【问题标题】:FluentNhibernate, map class to multiple tablesFluentNhibernate,将类映射到多个表
【发布时间】:2023-04-09 10:24:02
【问题描述】:

考虑类 A、B 和 C,A 和 B 都有一个 C 的集合。我想将这些集合映射到不同的表,所以我有表 A_C 和 B_C。我尝试这样做:

public class AMap : ClassMap<A>
{    
    Public AMap()
    { 
       Id(x => x.Id).GeneratedBy.Identity();
       HasMany(x => x.Cs).Table("A_C"); 
    }  
}

public class BMap : ClassMap<B>
{    
    Public BMap()
    { 
       Id(x => x.Id).GeneratedBy.Identity();
       HasMany(x => x.Cs).Table("B_C"); 
    }  
}

public class CMap : ClassMap<C>
{    
    Public CMap()
    { 
       Id(x => x.Id).GeneratedBy.Identity();
    }  
}

..(带有一些额外的属性),但它仍然只创建一个名为“C”的表。那么正确的方法是什么?

【问题讨论】:

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


    【解决方案1】:

    我会说继续制作单独的表(您自己而不使用架构导出),并按照您知道它们应该工作的方式正确配置您的映射。只要您正确配置了东西,NHibernate 就应该解决问题。您可能必须告诉它要加入的键列的名称。您仍然可以使用模式导出来生成其他表。完成后,在 NHibernate 后面添加额外的表。

    public class AMap : ClassMap<A>
    {    
        Public AMap()
        { 
           // ...
           HasMany(x => x.Cs).Table("A_C").KeyColumn("TheNameOfA'sPrimaryKeyColumn"); 
        }  
    }
    
    public class BMap : ClassMap<B>
    {    
        Public BMap()
        { 
           // ...
           HasMany(x => x.Cs).Table("B_C").KeyColumn("TheNameOfB'sPrimaryKeyColumn"); 
        }  
    }
    

    NHibernate 应该正确地进行连接。如果没有,请告诉我。此外,如果您正在处理复合键并需要帮助,请告诉我。

    【讨论】:

    • 如果您接受 NHibernate 的默认值,则无需指定 KeyColumn。它会弄清楚的。 A_Id 和 B_Id 之类的东西。这通常是它为外键生成列名的方式。
    • 哦,所以理解正确;根本不可能从映射中自动生成表,在使用自定义表名时也不能通过模式导出?
    • 嗯……我不确定。它实际上应该工作。为什么不是,需要什么额外的配置?我不知道。但看起来上面的设置绝对应该让它生成单独的表。模式导出的问题在于它有点像一次性的事情。一旦它生成了您的数据库,您就需要保留该脚本的副本。这是一件方便的事情,因为当您确实决定使用它时,您总是会得到一个准确反映最新版本数据模型的脚本。但只要你的桌子没有改变,你就很好。
    • 所以我想说让它尽其所能,然后根据自己的喜好进行调整。完成后,保存脚本,在数据模型更改之前无需生成新脚本。除此之外,您可以将未生成的表编写成自己的脚本。然后,一旦工具完成,运行脚本以生成另一个表。只需按一下按钮 (F5) 即可完成。现在您当然不想在流程中引入这个额外的手动步骤,但如果必须,那就这样吧。
    • 基本上我要说的是,如果没有其他人能弄清楚为什么导出工具没有生成那个额外的表,那么你的替代方案一点也不差。但是,是的,如果该工具能弄清楚到底该做什么,那就太好了。非常令人费解的是为什么它不会生成您的表格。无论如何,祝我的朋友好运。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2012-03-14
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多