我已经阅读了很多关于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>();
}
}
我需要帮助的部分是TableRef
在ReferencesAny()
中引用的AddressXref
如何在班级中定义?
另外,在创建数据记录时如何在代码中使用它?我的形象它将类似于:
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,但我仍然对学习曲线感到惊讶。 :)
谢谢, 拉斯
答案 0 :(得分:2)
由于Household和Client都不共享除object之外的基类,因此必须将其声明为:
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