C# 流利的NHibernate,使用接口
我刚切换到Fluent NHibernate,遇到了一个问题,没有找到任何相关信息 情况是这样的:C# 流利的NHibernate,使用接口,c#,nhibernate,interface,mapping,fluent,C#,Nhibernate,Interface,Mapping,Fluent,我刚切换到Fluent NHibernate,遇到了一个问题,没有找到任何相关信息 情况是这样的: public class Field : DomainObject, IField { public Field() { } public virtual string Name { get; set; } public virtual string ContactPerson { get; set; } public virtual bool
public class Field : DomainObject, IField
{
public Field()
{
}
public virtual string Name { get; set; }
public virtual string ContactPerson { get; set; }
public virtual bool Private { get; set; }
public virtual IAddress Address { get; set; }
}
IadAddress是由名为Address的类实现的接口
public class Address : DomainObject, IAddress
{
public Address()
{
}
public virtual string City { get; set; }
public virtual string Country { get; set; }
public virtual string PostalCode { get; set; }
public virtual string StreetAddress { get; set; }
}
这是两个类的映射文件
地址
public class AddressMap : ClassMap<Address>
{
public AddressMap()
{
WithTable("Addresses");
Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid();
Map(x => x.City, "City");
Map(x => x.Country, "Country");
Map(x => x.PostalCode, "PostalCode");
Map(x => x.StreetAddress, "StreetAddress");
}
}
公共类地址映射:类映射
{
公共地址映射()
{
附表格(“地址”);
Id(x=>x.Id,“Id”).Access.AsCamelCaseField(前缀.下划线).GeneratedBy.Guid();
地图(x=>x.城市,“城市”);
地图(x=>x.国家,“国家”);
Map(x=>x.PostalCode,“PostalCode”);
Map(x=>x.StreetAddress,“StreetAddress”);
}
}
场
公共类字段映射:类映射
{
公共领域地图()
{
WithTable(“字段”);
Id(x=>x.Id,“Id”).Access.AsCamelCaseField(前缀.下划线).GeneratedBy.Guid();
映射(x=>x.Name,“Name”);
映射(x=>x.ContactPerson,“ContactPerson”);
Map(x=>x.Private,“Private”);
引用(x=>x.Address,“AddressId”).Cascade.Delete().Cascade.SaveUpdate();
}
}
因此,当我试图从数据库中检索字段对象时,我得到一个NHibernate错误,该错误表示IAddress未映射。有没有办法指定NHibernate在映射中使用Address类
如果需要更多信息,请告诉我
非常感谢
Charles在字段对象上,您有一个IADRESS类型的对象。这可以通过任意数量的不同实现来实现。根据您的要求,每个实现都有自己的映射,这将给NHibernate带来许多困难(不可能?) 一个简单的例子有助于说明。假设您有两个地址1和地址2。它们分别保存在各自的表TBladdress 1和TBladdress 2中。当您尝试加载Field对象时,NHibernate只知道您有一些实现了IAddress的东西,它不知道是哪个实现被持久化了。它如何知道使用哪个映射来检索任何给定字段的子对象
我确信会有更多的复杂情况,但这个例子说明了为什么必须为您声明的对象的确切类型创建映射。我发现使用接口而不是具体类作为属性是有充分理由的 例如,如果您的Field类位于Address类的单独项目中,并且您对Address类的项目与Field类的项目没有依赖关系 处理这种情况还有其他方法,但最简单的方法通常是尝试您正在做的事情,并明确地告诉NHibernate要用于iAdress的具体类 现在可以在Fluent NHibernate中执行此操作,如下所示:
References(x => x.Address, "AddressId")
.Class(typeof(Address);
不幸的是,你不能用HasMany或HasManyToMany来做这件事。我不确定这是否可能,因为C#中缺乏良好的协方差支持。如果您有兴趣将ORM完全与域层分离,并在整个数据层中引用接口,而不是指定具体的类,则可以实现EmptyInterceptor以在两者之间映射
请参阅我的答案。您如何在数据库中建模IAddress层次结构?每个层次结构的表(一个包含所有类型地址的表),还是每个具体类的表?您说您切换到了Fluent,因此发布一个XML映射示例可能有助于确定您要完成的任务。事实上,我使用Fluent Nhibernate从ADO.NET实体框架切换到了Nhibernate。在我的数据库中,有一个包含所有类型地址的表。顺便说一句,我决定删除这些接口,我意识到它是无用的。但我认为这个问题仍然有效。谢谢,CharlesUpdate:您可以使用
引用(x=>x.Address).Column(“AddressId”)代码>通过添加泛型类型参数,您可以对“HasMany”和“HasManyToMany”执行相同的操作。非常感谢,这正是我想要的。。。尝试将.CollectionType()链接到my HasMany(),但似乎不起作用。更新为+1<代码>有许多(s=>s.Features).KeyColumn(“SiteId”)代码>其中s.Features是iFeatureInstanceHanks的集合,它确实帮助迷路的人找到了路。@cbp感谢您的回复。这是可能的。使用ReferencesAny。看看然后使用AddMetaValue注册实例化接口的每个类。
References(x => x.Address, "AddressId")
.Class(typeof(Address);