所以,我需要将我的类映射到数据库表,但有时我需要延迟加载,有时候要关闭。
实施例: 我制作了下面描述的这两个类的副本,并且我使用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; }
...
}
答案 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>();
}