0

比方说我有这个表:映射两班到同一个表在不同环境

Users 
ID PK 
NAME 
IS_REAL 

我有这个类为我的前端程序(网络上)

Class User 
{ 
    Int ID {get;set;} 
    string Name {get;set;} 
} 

我也希望有我的后台程序在其他类(在Intranet)

Class MUser : User 
{ 
    bool IsReal {get;set;} 
} 

有没有一种方法,我可以用我的MAPP因此,如果我的某个字段发生更改,我只需要在一个位置进行更改,而不是重复映射?

在此先感谢,
埃米尔。

编辑:

只是为了澄清,这两个环境彼此断开,而我只在一侧(内部网络环境)

回答

0

http://nhibernate.info/doc/nh/en/index.html#inheritance-tableperconcreate-polymorphism

的“Is_Real”属性

请注意,我们没有明确提到IPayment接口。 另请注意,IPayment的属性映射到 的每个子类中。如果要避免重复,请考虑使用XML 实体(例如,DOCTYPE声明中的[] 和映射中的&allproperties;)。

+0

这里每个类映射到不同的表。我需要映射到同一个表中的类。我也没有鉴别... – Amir

+0

以及那只是一个指针。您需要定义可重用的xml实体,然后在您的hbm中使用它们,即使用基于xml的映射。 http://www.quackit.com/xml/tutorial/xml_creating_entities.cfm – kalki

0

想法是使用每个层次结构映射表。 但是在这种情况下,你的表应该包含额外的Discriminator列,所以NHibernate可以使用Discriminator Value区分你的Domain类中的记录。

要做到这一点,请使用类似下面的代码:

public class UsersMap : ClassMapping<Users> 
{ 
     public UsersMap() 
     { 
      Table("Users"); 
      Id(u => u.Id, args => args.Generator(Generators.Guid)); 
      Property(u => u.Name, args => args.NotNullable(true)); 
      Discriminator(t => { 
         t.Force(true); 
         t.Insert(true); 
         t.Length(32); 
         t.NotNullable(true); 
         t.Type(NHibernateUtil.String); 
         t.Column("Discriminator"); 
        }); 
      DiscriminatorValue("User"); 
     } 
} 

public class MUserMap : SubclassMapping<MUser> 
{ 
     public MUserMap() 
     { 
      Property(u => u.IsReal, args => args.NotNullable(true)); 
      DiscriminatorValue("MUser"); 
     } 
} 
+0

但我不需要区分记录,我希望所有记录都在两个实体中获取,唯一的区别是我没有在互联网上的“Is_Real”属性 – Amir

+0

@Amir然后这不是一个映射问题。这是一个应用程序设计的问题。您可以在域图层上使用具有IsReal属性的完整用户类以及相应的映射。 在不同的应用程序中,您可以在应用程序层上为单独的用户(用于Internet)和MUser用于Intranet。并使用应用服务从域层用户映射到应用层用户。 –

+0

@Amir如果你不需要显示一个实体的细节w.r.t一个特定的视图,那么不要显示它。将表映射到不同实体的唯一好处是用于查询投影,这也可以通过标量查询轻松实现。 – kalki

相关问题