Here is the domain:

public class Team : BaseEntity<Team>
{
    private readonly IesiGeneric.ISet<Match> matchesAtHome = new
HashedSet<Match>();
    private readonly IesiGeneric.ISet<Match> matchesOnRoad = new
HashedSet<Match>();

    private readonly IesiGeneric.ISet<TeamRoster> rosters = new
HashedSet<TeamRoster>();

    public Team()
    {
        rosters.Add(new TeamRoster(this, "Default", true));
    }

    public IEnumerable<TeamRoster> Rosters { get { return rosters; } }
    public IEnumerable<Strategy> Strategies { get { return
strategies; } }

    public IEnumerable<Match> MatchesAtHome { get { return
matchesAtHome; } }
    public IEnumerable<Match> MatchesOnRoad { get { return
matchesOnRoad; } }

    public Sex Sex { get; set; }
    public bool Visible { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }

    public TeamRoster DefaultRoster
    {
        get { return Rosters.Where(r =>
r.IsDefault).FirstOrDefault(); }
    }

    public IEnumerable<Match> AllMatches
    {
        get { return MatchesAtHome.Union(MatchesOnRoad); }
    }
}

public class Match : BaseEntity<Match>
{
    private Team roadTeam;
    private Team homeTeam;
    private Roster homeRoster;
    private Roster roadRoster;

    public Match()
    {
    }

    public Team HomeTeam
    {
        get { return homeTeam; }
        set
        {
            if (homeTeam == value)
                return;

            homeTeam = value;

            if (value == null)
            {
                HomeRoster = null;
                return;
            }

            HomeRoster = new Roster(value);
        }
    }

    public Team RoadTeam
    {
        get { return roadTeam; }
        set
        {
            if (roadTeam == value)
                return;

            roadTeam = value;

            if (value == null)
            {
                RoadRoster = null;
                return;
            }

            RoadRoster = new Roster(value);
        }
    }

    public Roster HomeRoster
    {
        get { return homeRoster; }
        private set
        {
            homeRoster = value;

            if (homeRoster == null || homeRoster.Team.DefaultRoster ==
null)
                return;

            homeRoster.Team.DefaultRoster.Players.ForEach(pit =>
homeRoster.AddPlayer(pit.Player,
 
pit.PlayerNumber,
 
pit.Position));
        }
    }

    public Roster RoadRoster
    {
        get { return roadRoster; }
        private set
        {
            roadRoster = value;

            if (roadRoster == null || roadRoster.Team.DefaultRoster ==
null)
                return;

            roadRoster.Team.DefaultRoster.Players.ForEach(pit =>
roadRoster.AddPlayer(pit.Player,
 
pit.PlayerNumber,
 
pit.Position));
        }
    }
}

public class Roster : BaseEntity<Roster>
    {
        private readonly Iesi.Collections.Generic.ISet<PlayerInTeam>
players = new HashedSet<PlayerInTeam>();

        protected Roster()
        {

        }

        public Roster(Team team)
            : this()
        {
            Team = team;
        }

        public Team Team { get; private set; }

        public IEnumerable<PlayerInTeam> Players { get { return
players; } }

        public PlayerInTeam AddPlayer(Player player, int playerNumber
= 0, Position playerPosition = null)
        {
            PlayerInTeam pit = new PlayerInTeam(this, player,
playerNumber == 0 ? player.DefaultNumber : playerNumber,
playerPosition ?? player.DefaultPosition);
            players.Add(pit);

            return pit;
        }

        public void RemovePlayer(Player player)
        {
            var playerInTeam = Players.First(pit => pit.Player ==
player);
            player.RemovePlayerFromRoster(playerInTeam);

            players.Remove(playerInTeam);
        }

        public void UpdatePlayers(IEnumerable<Player> newPlayers)
        {
            foreach (var newPlayer in newPlayers.Where(newPlayer => !
Players.Any(pit => pit.Player.Equals(newPlayer))))
                AddPlayer(newPlayer);

            for (int i = players.Count - 1; i >= 0; i--)
            {
                var player = Players.ElementAt(i).Player;

                if (!newPlayers.Contains(player))
                    RemovePlayer(player);
            }
        }

        public void Clear()
        {
            foreach (var playerInTeam in Players)
 
playerInTeam.Player.RemovePlayerFromRoster(playerInTeam);

            players.Clear();
        }
    }

public class TeamRoster : Roster
{
    protected TeamRoster()
    {

    }

    public TeamRoster(Team team, string name, bool isDefault)
        : base(team)
    {
        IsDefault = isDefault;
        Name = name;
    }

    public bool IsDefault { get; set; }
    public string Name { get; set; }
}

I hope this helps :)



On 8 nov, 20:17, Fabio Maulo <[email protected]> wrote:
> To know the answer, perhaps, the domain is required.
> If you will generate the DB through NH the domain is enough if not, to know
> if the mapping is correct, we need the schema too.
>
>
>
>
>
>
>
>
>
> On Mon, Nov 8, 2010 at 1:15 PM, Michael Delva <[email protected]> wrote:
> > Hello everybody,
>
> > I'm still low on the learning curve of NH, and I have some problems to
> > correctly map my entities.
>
> > Here is what the entities I have, and their relationships:
>
> > A Team entity, which has multiple TeamRoster. Each TeamRoster contains
> > a list of references to Player, and with each reference, stores the
> > number of the player.
> > A Match entity, which has 2 references to Team, and 2 references to
> > Roster.
>
> > Here, TeamRoster inherits from Roster, and just add some specific
> > properties it needs.
>
> > Here are the mappings of these entities, created with FluentNH:
>
> > * Team
>
> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
> > access="property" auto-import="true" default-cascade="none" default-
> > lazy="true">
> >  <class xmlns="urn:nhibernate-mapping-2.2" mutable="true"
> > name="Emidee.CommonEntities.Team, Emidee.CommonEntities,
> > Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Teams">
> >    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0,
> > Culture=neutral, PublicKeyToken=b77a5c561934e089">
> >      <column name="Id" />
> >      <generator class="increment" />
> >    </id>
> >    <set cascade="all-delete-orphan" inverse="true" name="Rosters"
> > mutable="true">
> >      <key>
> >        <column name="Team_id" />
> >      </key>
> >      <one-to-many class="Emidee.CommonEntities.TeamRoster,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" />
> >    </set>
> >    <set inverse="true" name="MatchesAtHome" mutable="true">
> >      <key>
> >        <column name="HomeTeam_id" />
> >      </key>
> >      <one-to-many class="Emidee.CommonEntities.Match,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" />
> >    </set>
> >    <set inverse="true" name="MatchesOnRoad" mutable="true">
> >      <key>
> >        <column name="RoadTeam_id" />
> >      </key>
> >      <one-to-many class="Emidee.CommonEntities.Match,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" />
> >    </set>
> >  </class>
> > </hibernate-mapping>
>
> > * Roster
>
> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
> > access="property" auto-import="true" default-cascade="none" default-
> > lazy="true">
> >  <class xmlns="urn:nhibernate-mapping-2.2" mutable="true"
> > name="Emidee.CommonEntities.Roster, Emidee.CommonEntities,
> > Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
> > table="`Roster`">
> >    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0,
> > Culture=neutral, PublicKeyToken=b77a5c561934e089">
> >      <column name="Id" />
> >      <generator class="increment" />
> >    </id>
> >    <set cascade="all-delete-orphan" inverse="true" name="Players"
> > mutable="true">
> >      <key>
> >        <column name="Roster_id" />
> >      </key>
> >      <one-to-many class="Emidee.CommonEntities.PlayerInTeam,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" />
> >    </set>
> >    <many-to-one class="Emidee.CommonEntities.Team,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" name="Team">
> >      <column name="Team_id" not-null="true" />
> >    </many-to-one>
> >    <joined-subclass name="Emidee.CommonEntities.TeamRoster,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" table="`TeamRoster`">
> >      <key>
> >        <column name="Roster_id" />
> >      </key>
> >      <property name="IsDefault" type="System.Boolean, mscorlib,
> > Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
> >        <column name="IsDefault" length="250" not-null="true" />
> >      </property>
> >      <property name="Name" type="System.String, mscorlib,
> > Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
> >        <column name="Name" length="250" not-null="true" />
> >      </property>
> >      <many-to-one class="Emidee.CommonEntities.Team,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" name="Team">
> >        <column name="Team_id" not-null="true" />
> >      </many-to-one>
> >    </joined-subclass>
> >  </class>
> > </hibernate-mapping>
>
> > * Match
>
> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
> > access="property" auto-import="true" default-cascade="none" default-
> > lazy="true">
> >  <class xmlns="urn:nhibernate-mapping-2.2" mutable="true"
> > name="Emidee.CommonEntities.Match, Emidee.CommonEntities,
> > Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
> > table="Matches">
> >    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0,
> > Culture=neutral, PublicKeyToken=b77a5c561934e089">
> >      <column name="Id" />
> >      <generator class="increment" />
> >    </id>
> >    <many-to-one class="Emidee.CommonEntities.Championship,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" name="Championship">
> >      <column name="Championship_id" />
> >    </many-to-one>
> >    <many-to-one class="Emidee.CommonEntities.Team,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" name="HomeTeam">
> >      <column name="HomeTeam_id" not-null="true" />
> >    </many-to-one>
> >    <many-to-one class="Emidee.CommonEntities.Team,
> > Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral,
> > PublicKeyToken=null" name="RoadTeam">
> >      <column name="RoadTeam_id" not-null="true" />
> >    </many-to-one>
> >    <many-to-one cascade="save-update"
> > class="Emidee.CommonEntities.Roster, Emidee.CommonEntities,
> > Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
> > name="HomeRoster">
> >      <column name="HomeRoster_id" />
> >    </many-to-one>
> >    <many-to-one cascade="save-update"
> > class="Emidee.CommonEntities.Roster, Emidee.CommonEntities,
> > Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
> > name="RoadRoster">
> >      <column name="RoadRoster_id" />
> >    </many-to-one>
> >  </class>
> > </hibernate-mapping>
>
> > Is my Roster mapping correct? I've tried a lot of various combinations
> > to make this work, and I'd like to have your point of view about that.
>
> > And my other question concerns the relationships between Match and
> > Roster. One Match references 2 Rosters (one for each team). Is the
> > many-to-one relationship OK? I'm not sure about that. Should I use a
> > one-to-one relationship?
>
> > Thanks in advance
>
> > Mike
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "nhusers" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected]<nhusers%[email protected] 
> > >
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/nhusers?hl=en.
>
> --
> Fabio Maulo

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to