可以流畅的NHibernate的AutoMapper处理接口类型吗?

时间:2010-01-08 17:37:16

标签: interface fluent-nhibernate automapping

我输入了这个简化的示例而没有IDE的好处,所以原谅任何语法错误。当我尝试自动执行此操作时,当我尝试编译映射时,我得到了一个FluentConfigurationException -

  

“关联引用未映射的类   IEmployee“。

我想如果我要解决这个问题,当遇到IEmployer的引用时,我会遇到类似的错误。我并不反对手动创建一个ClassMap,但我更喜欢AutoMapper。

public interface IEmployer 
{ 
  int Id{ get; set; } 
  IList<IEmployee> Employees { get; set; } 
} 

public class Employer: IEmployer 
{ 
  public int Id{ get; set; } 
  public IList<IEmployer> Employees { get; set; } 
  public Employer() 
  { 
    Employees = new List<IEmployee>(); 
  } 
} 

public interface IEmployee 
{ 
  int Id { get; set; } 
  IEmployer Employer { get; set; } 
} 

public class Employee: IEmployee 
{ 
  public int Id { get; set;} 
  public IEmployer Employer { get; set;} 
  public Employee(IEmployer employer) 
  { 
    Employer = employer; 
  }
}

我尝试使用.IncludeBase<IEmployee>(),但无济于事。它的行为就像我从未调用过IncludeBase一样。

唯一的解决方案是不在我的域实体中使用接口还是回退到手动定义的ClassMap?

这两个选项都会对我的应用程序的设计方式造成严重问题。在完成所有功能的实现之前,我忽略了持久性,这是一个我不会再重复的错误: - (

2 个答案:

答案 0 :(得分:1)

这不是Fluent或其AutoMapper强加的限制,而是NHibernate本身的限制。

因此,我认为您不会使用手动类地图。您将不得不丢失属性和列表定义中的接口。您可以保留接口,但映射的属性和集合必须使用NHibernate知道的具体类型。

答案 1 :(得分:0)

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map<Address>(x => x.Address); // Person.Address is of type IAddress implemented by Address
    }
}