流畅的NHibernate将2个相同的类映射到一个表,第一个懒,第二个懒

时间:2010-12-30 14:08:24

标签: nhibernate class map fluent lazy-evaluation

所以,我需要将我的类映射到数据库表,但有时我需要延迟加载,有时候要关闭。

实施例: 我制作了下面描述的这两个类的副本,并且我使用FNH映射它们,但是在原始时延迟加载,并且一式两份。

http://i.stack.imgur.com/goG30.png

基本上,我希望能够从DB获得一个团队,该团队拥有TeamMembers的所有列表,但这些成员不应该拥有所有团队和其他所有团队,只需要有关TeamMember的简单信息。此外,当我从DB获得TeamMember时,我希望其所有团队仅包含简单信息。

“http://i.stack.imgur.com/7OkyD.png” - >他们不允许新用户发布图片或链接。

因此,如果我只有这两个类,那么如果在任何一侧打开延迟加载,则不满足之前解释的一种情况。如果双方都懒惰,我会得到一大堆我不需要也不想要的数据。

起初,原件和副本有相同的名称,并且在不同的包中,但我得到一个例外,即映射是模糊的。如果有办法实现这一点,那将是理想的。 有没有办法做到这一点?

我找不到答案所以我将副本的名称更改为NameOfOriginal + Lite。 解析了映射,但是当我想从数据库中获取团队时,我得到一个例外:

{“ORA-00904:\”SUPERVIZ _ \“。\”TEAMMEMBERLITE_ID \“:标识符无效\ n”}

所以,显然FNH读取一个类名并广告“_ID”并将其用作我的重复类的ID,这会导致问题。我试过了             .ParentKeyColumn( “”)             .ChildKeyColumn( “”) 但没有成功。

我希望我没有太多困惑你。)

    [DataContract]
    public class Team
    {
            [DataMember]
            public virtual int Team_id { get; private set; }

            [DataMember]
            public virtual String Name { get; set; }

            [DataMember]
            public virtual String Description { get; set; }

            [DataMember]
            public virtual TeamMember Deputy { get; set; }

            [DataMember]
            public virtual TeamMember Leader { get; set; }

            [DataMember]
            public virtual IList<TeamMember> TeamMembers { get; set; }

            [DataMember]
            public virtual IList<TeamMember> Supervizors { get; set; }
    ...
    }


    [DataContract]
    public class TeamMember
    {
            [DataMember]
            public virtual int TeamMember_id { get; set; }

            [DataMember]
            public virtual String First_name { get; set; }

            [DataMember]
            public virtual String Last_name { get; set; }

            [DataMember]
            public virtual String Sid { get; set; }

            [DataMember]
            public virtual IList<Team> SupevisingTeams { get; set; }

            [DataMember]
            public virtual IList<Team> LeaderInTeams { get; set; }

            [DataMember]
            public virtual IList<Team> DeputyInTeams { get; set; }

            [DataMember]
            public virtual IList<Team> MemberInTeams { get; set; }
    ...
    }

1 个答案:

答案 0 :(得分:0)

如果为映射指定实体名称,则可以多次映射类。您需要使用ClassMap而不是自动映射。

使用Fluent NHibernate:

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class FooMap1 : ClassMap<Foo>
{
    public FooMap1()
    {
        Table("Foo");
        EntityName("Foo");
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

public class FooMap2 : ClassMap<Foo>
{
    public FooMap2()
    {
        Table("Foo");
        EntityName("Bar");
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

您需要在构建查询时指定实体名称,以使nhibernate使用正确的映射:

using (var session = _sessionFactory.GetCurrentSession())
{
   return session.CreateCriteria("Bar")
      .Add(Restrictions.Eq("Name", "Andrew"))
      .List<Foo>();
}