1

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

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. 新字段必须添加到与用户表相同的表中
  2. 扩展类型的代码存在于单独的项目中

例如,这是我的新课程:

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 接口的引用,则会引发错误:

来自表 Blogs 的关联引用了一个未映射的类:IUser

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

4

1 回答 1

0

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

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

于 2012-01-13T15:28:27.610 回答