C# 在不同环境中将两个类映射到同一个表

C# 在不同环境中将两个类映射到同一个表,c#,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,假设我有这张桌子: Users ID PK NAME IS_REAL 我的前端课程(在互联网上)有这门课 我还想为我的后端程序上另一门课(在内联网上) 是否有一种方法可以使用用户类的映射,因此如果我的某个字段发生更改,我只需在一个位置进行更改,而不必复制映射 提前感谢, 阿米尔 编辑: 只是为了澄清一下,这两个环境彼此断开连接,我只在一侧(intranet环境)有“Is_Real”属性 请注意,我们没有明确提到IPayment接口。 还请注意,IPayment的属性映射到每个 子类。如果您想避

假设我有这张桌子:

Users
ID PK
NAME
IS_REAL
我的前端课程(在互联网上)有这门课

我还想为我的后端程序上另一门课(在内联网上)

是否有一种方法可以使用用户类的映射,因此如果我的某个字段发生更改,我只需在一个位置进行更改,而不必复制映射

提前感谢,
阿米尔

编辑:

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

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


其思想是使用逐层次表映射。 但在这种情况下,您的表应该包含额外的鉴别器列,这样NHibernate就可以通过使用鉴别器值的域类来区分数据库中的记录

要做到这一点,请使用如下代码:

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");
        }
}
公共类用户映射:类映射
{
公共用户smap()
{
表(“用户”);
Id(u=>u.Id,args=>args.Generator(Generators.Guid));
属性(u=>u.Name,args=>args.NotNullable(true));
鉴别器(t=>{
t、 力(真);
t、 插入(正确);
t、 长度(32);
t、 不可为空(true);
t、 类型(NHibernateUtil.String);
t、 列(“鉴别器”);
});
鉴别器值(“用户”);
}
}
公共类MUserMap:子类映射
{
公共博物馆地图()
{
属性(u=>u.IsReal,args=>args.NotNullable(true));
鉴别器值(“MUser”);
}
}

但我不需要区分记录,我希望在两个实体中都提取所有记录,唯一的区别是我的实体中没有“is\u Real”属性internet@Amir那么这不是一个映射问题。这是一个应用程序设计的问题。您可以在域层上拥有具有IsReal属性和相应映射的完整用户类。在不同的应用程序中,可以在应用程序层上分别设置User(用于Internet)和MUser(用于intranet)。并使用应用程序服务从域层用户映射到应用程序层用户。@Amir如果不需要在特定视图中显示实体的详细信息,则不需要这样显示。将表映射到不同实体的唯一好处是查询投影,这也可以通过标量查询轻松实现。我编辑了我的问题,正如您所看到的,我不能使用服务在层之间传输对象…@Amir我不是指物理服务(如Web或Windows服务)。我的意思是你可以创建一个域项目,它将在你的两个应用程序之间共享。域项目将包含您的用户实体及其所有字段。然后每个应用程序都会有自己的应用程序项目,该项目将引用域并拥有自己的用户实体(internetUser或Intranet用户)。说到服务,我指的是一个类,它将使用Domain.User创建Internet/Intranet.User。这将把最终用户应用程序逻辑与普通域逻辑分开。这里的每个类都映射到不同的表。。。我需要将这些类映射到同一个表。我也没有鉴别器…那只是一个指针。如果使用基于xml的映射,则需要定义可重用的xml实体,然后在hbm中使用它们。
Class MUser : User
{
    bool IsReal {get;set;}
}
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");
        }
}