EF 模型.导航属性只能参与单个关系 [英] EF models. Navigation properties can only participate in a single relationship

查看:24
本文介绍了EF 模型.导航属性只能参与单个关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的实体,它们紧密相连.

I have my entities like this, they are closely linked.

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

    public int FirstTeamId { get; set; }
    public Team FirstTeam { get; set; }
    public int SecondTeamId { get; set; }
    public Team SecondTeam { get; set; }

    public Stadium Stadium { get; set; }
    public DateTime Date { get; set; }

    public GameStatus Result { get; set; }

    public Game(DateTime date , GameStatus result )
    {
        Date = date;
        Result = result;
    }
}

public class Player
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime Birthday { get; set; }
    public PlayerStatus Status { get; set; }
    public PlayerHealthStatus HealthStatus { get; set; }
    public int Salary { get; set; }
    public int TeamId { get; set; }
    public Team Team { get; set; }

    public Player(string name , string surname, DateTime birthday, PlayerStatus status, PlayerHealthStatus healthStatus, int salary)
    {
        Name = name;
        Surname = surname;
        Birthday = birthday;
        Status = status;
        HealthStatus = healthStatus;
        Salary = salary;
    }

}

public class Stadium
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Capacity { get; set; }
    public int PriceForPlace { get; set; }

    public Stadium(string name, int capacity, int priceForPlace)
    {
        Name = name;
        Capacity = capacity;
        PriceForPlace = priceForPlace;
    }
}

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Player> Players { get; set; }

    public List<Game> Games { get; set; }

    public Team(string name)
    {
        Name = name;
    }

    public Team(string name, List<Player> players) : this(name)
    {
        Players = players;

    }
}

在我的 Context 类中,我试图描述类之间的关系.但有些不对劲.

In my Context class I'm tried to describe my relationships between classes. But something isn't correct.

public class ApplicationContext : DbContext
{
    public DbSet<Player> Players { get; set; }
    public DbSet<Game> Games { get; set; }
    public DbSet<Team> Teams { get; set; }
    public DbSet<Stadium> Stadiums { get; set; }

    public ApplicationContext()
    {
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=best-komp;Database=FootballApplicationDataBase;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Player>()
            .HasOne(p => p.Team)
            .WithMany(t => t.Players)
            .HasForeignKey(p => p.TeamId)
            .HasPrincipalKey(t => t.Id);
        modelBuilder.Entity<Team>()
            .HasMany(p => p.Players)
            .WithOne(p => p.Team)
            .HasForeignKey(p => p.TeamId)
            .HasPrincipalKey(t => t.Id);

        modelBuilder.Entity<Game>()
            .HasOne(g => g.FirstTeam)
            .WithMany(t => t.Games)
            .HasForeignKey(t => t.FirstTeamId)
            .HasPrincipalKey(t => t.Id);
        modelBuilder.Entity<Game>()
            .HasOne(g => g.SecondTeam)
            .WithMany(t => t.Games)
            .HasForeignKey(t => t.SecondTeamId)
            .HasPrincipalKey(t => t.Id);


    }
}

这段代码有什么问题?因为我有导航属性只能参与单个关系".当我尝试对我的 ApplicationContext 做一些事情时出错.

What wrong with this code? Because I have "Navigation properties can only participate in a single relationship." error when I try to do something with my ApplicationContext.

推荐答案

您不能重复使用 Team.Games 作为 Game.FirstTeam 和 <代码>Team.SecondTeam.想想看,如果你把游戏添加到Team.Games,EF怎么知道它是哪个团队,第一还是第二?

You can't reuse Team.Games as the inverse property for both Game.FirstTeam and Team.SecondTeam. Think of it, if you add game to Team.Games, how would EF know which team it is, first or second?

您需要两个集合来描述关系.这也是为类模型添加更多含义的机会.例如(仅修改代码):

You need two collections to describe the relationships. And that's also a chance to add some more meaning to the class model. For example (only modified code):

public class Game
{
    ...
    public int HomeTeamId { get; set; }
    public Team HomeTeam { get; set; }
    public int AwayTeamId { get; set; }
    public Team AwayTeam { get; set; }
}

public class Team
{
    ...
    public List<Game> HomeGames { get; set; }
    public List<Game> AwayGames { get; set; }
}

对于一支球队来说,区分主客场比赛是有意义的,例如比较两种类型比赛的结果.

For a team it's meaningful to make a distinction between home and away games, for example to compare results in both types of games.

和映射:

modelBuilder.Entity<Game>()
    .HasOne(g => g.HomeTeam)
    .WithMany(t => t.HomeGames)
    .HasForeignKey(t => t.HomeTeamId)
    .HasPrincipalKey(t => t.Id);
modelBuilder.Entity<Game>()
    .HasOne(g => g.AwayTeam)
    .WithMany(t => t.AwayGames)
    .HasForeignKey(t => t.AwayTeamId).OnDelete(DeleteBehavior.NoAction)
    .HasPrincipalKey(t => t.Id);

如果使用Sql Server,这个删除行为指令是必要的,以防止不允许的多个级联路径.

If using Sql Server, this delete behavior instruction is necessary to prevent disallowed multiple cascade paths.

这篇关于EF 模型.导航属性只能参与单个关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆