Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent NHibernate复合物Id';s_C#_Fluent Nhibernate_Asp.net Mvc 4 - Fatal编程技术网

C# Fluent NHibernate复合物Id';s

C# Fluent NHibernate复合物Id';s,c#,fluent-nhibernate,asp.net-mvc-4,C#,Fluent Nhibernate,Asp.net Mvc 4,几个小时以来,我一直在努力让下面的内容发挥作用。但我似乎无法发现我做错了什么 我正在使用Fluent Nhibernate automapper(和一些重写)使该结构正常工作 public class Game:IKeyed<Guid> { public virtual Guid Id { get; set; } //properties } public class Team : IKeyed<Guid> { public virtual Gu

几个小时以来,我一直在努力让下面的内容发挥作用。但我似乎无法发现我做错了什么

我正在使用Fluent Nhibernate automapper(和一些重写)使该结构正常工作

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; }
}
公共类游戏:IKeyed
{
公共虚拟Guid Id{get;set;}
//性质
}
公共班级团队:Ikeed
{
公共虚拟Guid Id{get;set;}
//其他属性
公共虚拟IList游戏团队{get;set;}
}
公共类游戏团队:Ikeed
{
公共虚拟GameTeamId{get;set;}
公共虚拟int CurrentRound{get;set;}
公共虚拟IList循环{get;set;}
}
公共类GameTeamId
{
公共虚拟游戏{get;set;}
公共虚拟团队{get;set;}
//等于东西
}
公共类GameTeamRound:Ikeed
{
公共虚拟GameTeamRoundId{get;set;}
//性质
公共虚拟IList决策{get;set;}
}
公共类GameTeamRoundId
{
公共虚拟游戏团队游戏团队{get;set;}
公共虚拟整数轮号{get;set;}
}
游戏团队关系是我可以处理的。但目前,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");
    }
}
公共类GameTeamOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
//mapping.IgnoreProperty(gt=>gt.Id);
CompositeId(gt=>gt.Id)
.KeyProperty(id=>id.Game.id,“GameId”)
.KeyProperty(id=>id.Team.id,“TeamId”);
}
}
公共类GameTeamRoundOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
//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”);
}
}
我试过各种各样的东西。如果你能给我指出正确的方向,那就太好了

谢谢
Tim

为什么要为复合键添加额外的类?
它应该是这样工作的:

实体:

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; }
}
公共类游戏:IKeyed
{
公共虚拟Guid Id{get;set;}
//性质
}
公共班级团队:Ikeed
{
公共虚拟Guid Id{get;set;}
//其他属性
公共虚拟IList游戏团队{get;set;}
}
公共类游戏团队:Ikeed
{
公共虚拟游戏{get;set;}
公共虚拟团队{get;set;}
公共虚拟int CurrentRound{get;set;}
公共虚拟IList循环{get;set;}
}
公共类GameTeamRound:Ikeed
{
公共虚拟游戏团队游戏团队{get;set;}
公共虚拟整数轮号{get;set;}
//性质
公共虚拟IList决策{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");
    }
}
公共类GameTeamOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.CompositeId()
.KeyReference(id=>id.Game,“GameId”)
.KeyReference(id=>id.Team,“TeamId”);
}
}
公共类GameTeamRoundOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.CompositeId()
.KeyReference(id=>id.GameTeam.Game,“GameId”)
.KeyReference(id=>id.GameTeam.Team,“TeamId”)
.KeyProperty(id=>id.RoundNumber,“RoundId”);
}
}
请注意:我不确定是否可以在复合ID中使用这种嵌套。如果不可以,则需要为游戏和团队添加属性,并将调用分别委托给
GameTeam.Game
GameTeam.Team


此外,请重新考虑您的设计。对于新编写的应用程序,不建议使用复合键。如果可以避免,就避免它们。

为什么要额外的
Id
类?您应该将这些属性直接放入相应的实体中。此外:您得到的实际错误是什么?这是因为我使用的存储库模式依赖于一个名为Id的属性。这是对我来说最好的解决方案。我得到的错误如下。在“GameTeamId”类中找不到属性“Id”的getter。您应该按照模型对基础结构进行建模,而不是相反。我的第一个想法是按照您的建议在不使用复合键的情况下进行建模。也许这是最好的选择。只是好奇而已。他们为什么泄气?@MatrixCow:他们制造了各种各样的问题,其中一个你刚刚看到。我不确定他们是否只从ORM的角度或SQL的角度来阻止他们。好的非常感谢你的帮助。我将删除组合键,然后继续。