簡體   English   中英

流利的NHibernate復合ID

[英]Fluent NHibernate complex Composite Id's

我一直在努力使以下內容能夠工作幾個小時。 但是我似乎無法找出我在這里做錯了什么。

我正在使用Fluent Nhibernate自動映射器(以及一些替代)來使此結構正常工作。

public class Game:IKeyed<Guid>
{
    public virtual Guid Id { get; set; }
    //properties
}

public class Team : IKeyed<Guid>
{
    public virtual Guid Id { get; set; }
    //Other properties

    public virtual IList<GameTeam> GameTeams { get; set; }
}

public class GameTeam:IKeyed<GameTeamId>
{
    public virtual GameTeamId Id { get; set; }
    public virtual int CurrentRound { get; set; }
    public virtual IList<GameTeamRound> Rounds { get; set; }
}

public class GameTeamId
{
    public virtual Game Game { get; set; }
    public virtual Team Team { get; set; }

    //equals stuff
}

public class GameTeamRound : IKeyed<GameTeamRoundId>
{
    public virtual GameTeamRoundId Id { get; set; }
    //Properties

    public virtual IList<TeamRoundDecision> Decisions { get; set; }
}

public class GameTeamRoundId
{
    public virtual GameTeam GameTeam { get; set; }
    public virtual int RoundNumber { get; set; }
}

我可以管理GameTeam關系。 但是,目前GameTeamRound鏈接還有點距離。 :)我什至更深入。 但是我不想使這個問題變得更加復雜。

我正在使用NHibernate為我生成數據庫。 所以我從我的模型開始。 為了使這項工作有效,我使用一些映射替代來確保這些組合鍵正常工作。

public class GameTeamOverride : IAutoMappingOverride<GameTeam>
{
    public void Override(AutoMapping<GameTeam> mapping)
    {
        //mapping.IgnoreProperty(gt => gt.Id);
        mapping.CompositeId(gt => gt.Id)
               .KeyProperty(id => id.Game.Id, "GameId")
               .KeyProperty(id => id.Team.Id, "TeamId");
    }
}

public class GameTeamRoundOverride : IAutoMappingOverride<GameTeamRound>
{
    public void Override(AutoMapping<GameTeamRound> mapping)
    {
        //mapping.IgnoreProperty(gtr => gtr.Id);
        mapping.CompositeId(gtr => gtr.Id)
               .KeyProperty(id => id.GameTeam.Id.Game.Id, "GameId")
               .KeyProperty(id => id.GameTeam.Id.Team.Id, "TeamId")
               .KeyProperty(id => id.RoundNumber, "RoundId");
    }
}

我已經嘗試過各種方法。 如果您能指出我正確的方向,那就太好了。 :)

謝謝蒂姆

為什么要為組合鍵添加額外的類?
它應該以某種方式工作:

實體:

public class Game:IKeyed<Guid>
{
    public virtual Guid Id { get; set; }
    //properties
}

public class Team : IKeyed<Guid>
{
    public virtual Guid Id { get; set; }
    //Other properties

    public virtual IList<GameTeam> GameTeams { get; set; }
}

public class GameTeam:IKeyed<GameTeamId>
{
    public virtual Game Game { get; set; }
    public virtual Team Team { get; set; }
    public virtual int CurrentRound { get; set; }
    public virtual IList<GameTeamRound> Rounds { get; set; }
}

public class GameTeamRound : IKeyed<GameTeamRoundId>
{
    public virtual GameTeam GameTeam { get; set; }
    public virtual int RoundNumber { get; set; }
    //Properties

    public virtual IList<TeamRoundDecision> Decisions { get; set; }
}

映射:

public class GameTeamOverride : IAutoMappingOverride<GameTeam>
{
    public void Override(AutoMapping<GameTeam> mapping)
    {
        mapping.CompositeId()
               .KeyReference(id => id.Game, "GameId")
               .KeyReference(id => id.Team, "TeamId");
    }
}

public class GameTeamRoundOverride : IAutoMappingOverride<GameTeamRound>
{
    public void Override(AutoMapping<GameTeamRound> mapping)
    {
        mapping.CompositeId()
               .KeyReference(id => id.GameTeam.Game, "GameId")
               .KeyReference(id => id.GameTeam.Team, "TeamId")
               .KeyProperty(id => id.RoundNumber, "RoundId");
    }
}

請注意:我不確定是否可以在復合ID中使用這種嵌套。 如果不是,則需要為Game and Team添加屬性,並將對它們的調用分別委派給GameTeam.GameGameTeam.Team

此外,請重新考慮您的設計。 不建議將組合鍵用於新編寫的應用程序。 如果可以避免,請避免使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM