NHibernate - 实现相同接口的多种类型

时间:2012-01-13 15:19:23

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我的应用程序定义了以下类型

public interface IUser {
   int Id { get; set; }
   int UserName { get; set; }
}

public class User : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
}

User类可以流畅地映射,如:

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
    }
}

我想创建IUser的另一个实现,但我有几个限制:

  1. 必须将新字段添加到与Users表
  2. 相同的表中
  3. 扩展类型的代码存在于单独的项目中
  4. 例如,这是我的新课程:

    public class CustomUser : IUser {
       public virtual int Id { get; set; }
       public virtual string UserName { get; set; }
       public virtual string Name { get; set; }
    }
    

    映射如下:

    public class CustomUserMap : ClassMap<CustomUser> {
        public CustomUserMap() {
            Table("Users");
            Id(x => x.Id);
            Map(x => x.UserName);
            Map(x => x.Name);
        }
    }
    

    我遇到的第一个问题是它不喜欢要映射两次的相同接口。我通过在Application_Start事件中添加一些代码来克服这个问题,只有在没有CustomUserMap类的情况下才添加UserMap类。

    但是我很快遇到了我的下一个问题,如果我在另一个类型中添加对IUser接口的引用,则会抛出错误:

      

    表博客中的关联是指未映射的类:IUser

    我可能会发生完全错误的事情,如果有人能告诉我我做错了什么,我会很感激。感谢

1 个答案:

答案 0 :(得分:0)

如果您希望它们映射到同一个表,为什么不继承用户?这也将实现IUser接口。

为了防止重复选择(在获取User时,它可能在第二次往返中获取CustomerUser),您需要在User类上指定显式多态。在hbm文件中,这将是polymorphism =“explicit”,不知道流利的nhibernate。