【问题标题】:Fluent NHibernate Subclass mapping with foreign key流利的 NHibernate 子类映射与外键
【发布时间】:2012-05-24 07:47:22
【问题描述】:

我有这个对象:

class Person { Int32 id; String name; /*..*/ Adress adress; }
class Employee : Person { String e_g_Tax; /*..*/ Guid relationshipToManagmentId; }

以及以下映射前提:
(a) “relationshipToManagmentId”应该是外键。
(b) 表“RelationshipToManagment”是一个非映射表,(应用程序的旧部分)
(c) 映射策略是 TPT。 (至少对于新对象:-)

映射,直到现在:

public class PersonMap : ClassMap<Person> {
  public PersonMap(){
    Id(x => x.id);
    Map (x => x.Nachname).Length(255).Not.Nullable();
    /*..*/
    References(x => x.Adresse).Class(typeof(Adresse)).Not.Nullable();
  }
}
public class EmployeeMap : SubclassMap<Employee>
    {
        public EmployeeMap()
        {
            Map(x => x.e_g_Tax, "enjoytax")
                .Not.Nullable();
            /*..*/
            Join("RelationshipToManagment", xJoin =>
            {
                //xJoin.Table("RelationshipToManagment");
                xJoin.Fetch.Join();
                xJoin.KeyColumn("ID");
                xJoin.Map(x => x.relationshipToManagmentId)
                    .Not.Nullable() ;
            }); // --> exception!!

我该怎么写?

【问题讨论】:

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


    【解决方案1】:

    Join() 只能在主键(属性 id)上连接到另一个表,但您需要在外键列上连接。一个普通的参考做你想做的事

    class Employee : Person
    {
        Management Management;
    }
    
    public EmployeeMap()
    {
        References(x => x.Management).Column("relationshipToManagmentId");
    }
    

    更新:如果您需要 RelationshipToManagment 表中的只读信息,您可以使用公式属性

    public EmployeeMap()
    {
        Map(x => x.RelationshipToManagment).Formula("(SELECT m.Title FROM RelationshipToManagment m WHERE m.Id = relationshipToManagmentId)");
    }
    

    【讨论】:

    • 谢谢,但我与Management 没有任何关系。 RelationshipToManagment 表描述了一种特殊的关系,如亲属关系或已婚......这是一个元关系实体!
    • 如果RelationshipToManagement 中的行是静态的,您可以使用用户类型来伪造它。如果不是,您必须映射一个引用,但您可以将其隐藏为私有并将外观实现为员工的属性。发布表RelationshipToManagement 或输入与我聊天
    • 该表如下所示:RelationshipToManagment { guid Id; String Title; String Description;} 他几乎是静态的,并被许多其他表使用。现在我认为最好的|最快的方法是关系到管理表的映射,但并不理想。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多