【问题标题】:How do I use Fluent NHibernate ReferencesAny mapping?如何使用 Fluent NHibernate ReferencesAny 映射?
【发布时间】:2012-08-11 06:15:04
【问题描述】:

我已经阅读了很多关于 Fluent NHibernate 的 ReferencesAny 的文章,但我还没有看到完整的示例。我想我明白了大部分,但有一部分我不明白。在类映射中ReferencesAny(x => x.MemberName) 用于定义与一个或多个引用类的关系。 MemberName 是什么?它是如何定义的以及如何用于在数据库中创建数据。

我有三张表,一张表中的记录可以引用另外两张表中的记录。前两个是自动映射的,所以没有具体定义Id字段。

public class Household
{
    public virtual string Name { get; set; }

    public virtual IList<AddressXref> AddressXrefs { get; set; }
}

public class Client
{
    public virtual string Name { get; set; }

    public virtual IList<AddressXref> AddressXrefs { get; set; }
}

我不确定AddressXref 表是否可以自动映射。如果是这样,我也需要找出如何做到这一点。现在,我将使用 Fluent 以传统方式进行操作。

public class AddressXref
{
    public virtual int id { get; set; }
    public virtual string TableName { get; set; }
    public virtual Int32 Table_id { get; set; }
    public virtual string Street { get; set; }
    public virtual string City { get; set; }
}

class AddressXrefMap : ClassMap<AddressXref>
{
    public AddressXrefMap()
    {
        Table("AddressXref");
        Id(x => x.id);
        Map(x => x.TableName);
        Map(x => x.Table_id);
        Map(x => x.Street);
        Map(x => x.City);

        ReferencesAny(x => x.TableRef)
            .AddMetaValue<Household>(typeof(Household).Name)
            .AddMetaValue<Client>(typeof(Client).Name)
            .EntityTypeColumn("TableName")
            .EntityIdentifierColumn("Table_id")
            .IdentityType<int>();
    }
}

我需要帮助的部分是ReferencesAny() 中提到的TableRefAddressXref 的成员是如何在类中定义的?

另外,在创建数据记录时如何在代码中使用它?我想象它会类似于这样:

Household Household = new Household();
Household.Name      = "Household #1";

AddressXref AddrXref = new AddressXref();
AddrXref.Street1   = "123 Popular Street";
AddrXref.City      = "MyTown";
AddrXref.TableRef  = Household;

Session.SaveOrUpdate(AddrXref);    

我喜欢将 Fluent 与 NHibernate 结合使用,但我仍然对学习曲线感到惊讶。 :)

谢谢, 拉斯

【问题讨论】:

    标签: nhibernate polymorphic-associations fluent automapping


    【解决方案1】:

    由于 Household 和 Client 不共享对象以外的基类,因此您必须将其声明为:

    public class AddressXref
    {
        public virtual int Id { get; set; }
        public virtual object TableRef { get; set; }
        public virtual string Street { get; set; }
        public virtual string City { get; set; }
    }
    

    并像这样测试它

    if (addrXref.TableRef is HouseHold)
        // it's a household
    

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-09-19
      • 1970-01-01
      • 2010-12-09
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多