Как мне реализовать решение для уникальных ключей?

#c# #repository-pattern

#c# #репозиторий-шаблон

Вопрос:

У меня есть 3 таблицы:

 Player => PlayerId (Primary Key), Name, etc  
Team => TeamId (Primary Key), Name, etc  
PlayerTeam => PlayerId, TeamId (The combination must be unique)  
  

тогда у меня есть следующее:

 public interface IEntityKey<TKey>
{
    TKey Id { get; }    
}

public interface IRepository<TKey, TEntity> where TEntity : class, IEntityKey<TKey>
{
  IQueryable<TEntity> All();
  TEntity FindBy(Expression<Func<TEntity, bool>> expression);
  ....
  TEntity FindBy(TKey id);
}
  

Теперь, хотя вышеприведенное будет отлично работать для таблиц с одним ключом, таких как таблица player или team, как бы мне реализовать его для моей таблицы playerteam? Мне нужно решение, которое будет обслуживать любое количество ключей. Я бы предпочел такое решение, как …

 public interface IEntityKey<TKey> where TKey : System.Tuple
{
    TKey Id { get; }    
}
  

более

 public interface IEntityKey<TKey1, TKey2>
{
    TKey1 Id1 { get; }    
    TKey2 Id2 { get; }    
}
  

Ответ №1:

Просто используйте свой оригинальный IEntityKey интерфейс с Tuple as TKey :

 public class PlayerTeam : IEntityKey<Tuple<int, int>>
{
    Tuple<int, int> IEntityKey<Tuple<int, int>>.Id
    {
        get { return Tuple.Create(PlayerId, TeamId); }
    }

    public int PlayerId { get; set; }
    public int TeamId { get; set; }
}
  

В качестве примечания, мне кажется, что PlayerTeam это не сущность, а просто ассоциация…