将两个类映射到不同环境中的同一个表

时间:2012-06-07 07:10:52

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

假设我有这张表:

Users
ID PK
NAME
IS_REAL

我的前端程序(在互联网上)有这个课程

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

我还希望为我的后端程序(在Intranet上)安排另一个课程

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

有没有办法可以将我的映射用于User类,所以如果我的某个字段发生变化,我只需要在一个地方进行更改而不是重复映射?

提前致谢,
阿米尔。

编辑:

为了澄清,两个环境彼此断开连接,我只在一侧(内部网环境)有“Is_Real”属性

2 个答案:

答案 0 :(得分:0)

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

  

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

答案 1 :(得分: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");
        }
}