【问题标题】:Entity Framework Core - Unique ConstraintEntity Framework Core - 唯一约束
【发布时间】:2019-04-19 23:35:26
【问题描述】:

我有两个模型(用户和游戏)它们由另一个名为 PlayerID 的模型连接。例如,用户可以为每个游戏拥有一个特殊的 ID。我想将其设置为每个游戏的用户只能有一个 ID。最好的做法是什么?

编辑:

我将进一步扩展它,以便您确切知道我在构建什么。我有玩诸如魔法聚会或口袋妖怪等游戏的玩家。这些游戏中的每一个都分配了他们的玩家 ID。所以MTG有DCI号码等等。每个游戏的每个玩家都有一个 ID,但每个游戏不超过一个,我需要确保玩家在同一个游戏中不能有多个 ID。

public class PlayerID
{
    public int PlayerID { get; set; }

    public string GamePlayerID { get; set; }

    public User User { get; set; }

    public Game Game { get; set; }

}

【问题讨论】:

  • 我将进一步扩展它,以便您确切知道我在构建什么。我有玩诸如魔法聚会或口袋妖怪等游戏的玩家。这些游戏中的每一个都分配了他们的玩家 ID。所以MTG有DCI号码等等。每个玩家在每个游戏中都有一个 ID,但不超过一个。
  • 正确,玩家可以玩很多游戏,但每个游戏只能有一个单独的 ID。一个玩家不能拥有多个魔法 ID,但可以拥有一个魔法 ID 和不同的口袋妖怪 ID。

标签: c# model-view-controller asp.net-core entity-framework-core


【解决方案1】:

一个玩家可以加入多个游戏,但不能多次加入同一个游戏。

这也属于你的业务逻辑,但你可以定义一个约束来保护自己免受错误的影响。

您的逻辑中需要多对多关系:

public class Game
{
    public int Id { get; set; }

    public ICollection<GamePlayer> GamePlayers { get; set; }
}

public class Player
{
    public int Id { get; set; }

    public ICollection<GamePlayer> GamePlayers { get; set; }
}

public class GamePlayer
{
    public int GameId { get; set; }
    public Game Game { get; set; }
    public int PlayerId { get; set; }
    public Player Player { get; set; }
}

...

modelBuilder.Entity<GamePlayer>(e =>
{
    // This safe-guards for duplicates.
    e.HasIndex(prp => new { prp.GameId, prp.PlayerId }).IsUnique();
    e.HasOne(prp => prp.Game).WithMany(prp => prp.GamePlayers).HasForeignKey(prp => prp.GameId);
    e.HasOne(prp => prp.Player).WithMany(prp => prp.GamePlayers).HasForeignKey(prp => prp.PlayerId);
}

【讨论】:

  • 太棒了!谢谢。我试试看。
猜你喜欢
  • 2017-05-05
  • 2018-09-28
  • 1970-01-01
  • 2012-08-02
  • 2016-07-12
  • 2020-08-10
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多