Как реализовать отношения многие ко многим в EF с ASP.NET MVC 5 - PullRequest
0 голосов
/ 21 мая 2019

Я только начал работать с EF и столкнулся с этой проблемой.У меня есть таблица TeamSeason со многими отношениями между командами и сезонами.Я также реализовал GenericRepository для связи с базой данных.Мои модели выглядят так:

 public class Team : ITeam
 {
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }

    public virtual ICollection<Season> SeasonsPlayed { get; set; }
 }

public class Season : ISeason
{
    public int Id { get; set; }

    [Required]
    public string LeagueName { get; set; }

    public ICollection<Team> Teams { get; set; }

    public void AddTeam(Team team)
    {
       Teams.Add(team);
    }
}


 public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    protected ApplicationDbContext _context;

    public GenericRepository(ApplicationDbContext context)
    {
        _context = context;
    }

    public virtual void Add(T t)
    {
        _context.Set<T>().Add(t);
        _context.SaveChanges();
    }

    public virtual async Task AddAsync(T t)
    {
        _context.Set<T>().Add(t);
        await _context.SaveChangesAsync();
    }

    public virtual int Count()
    {
        return _context.Set<T>().Count();
    }

    public virtual async Task<int> CountAsync()
    {
        return await _context.Set<T>().CountAsync();
    }

    public virtual void Delete(T entity)
    {
        _context.Set<T>().Remove(entity);
        _context.SaveChanges();
    }

    public virtual async Task<int> DeleteAsync(T entity)
    {
        _context.Set<T>().Remove(entity);
        return await _context.SaveChangesAsync();
    }

    public T Get(int id)
    {
        return _context.Set<T>().Find(id);
    }

    public IQueryable<T> GetAll()
    {
        return _context.Set<T>();
    }

    public virtual async Task<ICollection<T>> GetAllAsync()
    {
        return await _context.Set<T>().ToListAsync();
    }

    public virtual async Task<T> GetAsync(int id)
    {
        return await _context.Set<T>().FindAsync(id);
    }

    public void Save()
    {
        _context.SaveChanges();
    }

    public async virtual Task<int> SaveAsync()
    {
        return await _context.SaveChangesAsync();
    }

    public void Update(T t, object key)
    {
        if (t == null)
        {
            return;
        }

        T exist = _context.Set<T>().Find(key);
        if (exist != null)
        {
            _context.Entry(exist).CurrentValues.SetValues(t);
            _context.SaveChanges();
        }
    }

    public virtual async Task UpdateAsync(T t, object key)
    {
        if (t == null)
        {
            return;
        }

        T exist = await _context.Set<T>().FindAsync(key);
        if (exist != null)
        {
            _context.Entry(exist).CurrentValues.SetValues(t);
            await _context.SaveChangesAsync();
        }
    }

    private bool disposed = false;
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                _context.Dispose();
            }
            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

EF сгенерировал таблицу TeamSeason, в которой SeasonID и TeamID являются внешними ключами.

В моем контроллере уже есть Season и Team, и мне просто нужночтобы как-то представить отношения между ними в моей базе данных.

 [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> AddTeam([Bind(Include = "SeasonId,SeasonYear,SeasonName,SelectedTeamId")]
        TeamSeasonViewModel teamSeasonVM)
    {
        Season season = await _seasonService.FindSeasonAsync(teamSeasonVM.SeasonId).ConfigureAwait(false);
        Team team = await _teamService.FindTeamAsync(teamSeasonVM.SelectedTeamId.Value).ConfigureAwait(false);
        return RedirectToAction("Index");
    }

1 Ответ

1 голос
/ 21 мая 2019

В вашем DBContext вы можете настроить отношения, например:


modelBuilder.Entity<Season>()
   .HasMany(b => b.Team)
   .WithMany(c => c.Seasons)
   .Map(cs =>
   {
       cs.MapLeftKey("SeasonId");
       cs.MapRightKey("SeasonId");
       cs.ToTable("SeasonTeam");
   });

пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...