さまざまなタイプの ID を持つ汎用 GetById() を実装する方法 質問する

さまざまなタイプの ID を持つ汎用 GetById() を実装する方法 質問する

異なる ID タイプを持つ可能性のあるタイプに対応する汎用メソッドを実装しようとしていますGetById(T id)。私の例では、タイプ の ID を持つエンティティintと、タイプ の IDを持つエンティティがありますstring

しかし、エラーが発生し続けますが、その理由はわかりません。

'int' 型は、メソッド IEntity のジェネリック型でパラメータ 'TId' として使用するには参照型である必要があります。

エンティティ インターフェイス:

intまたは のタイプの ID を持つことができるドメイン モデルに対応するためですstring

public interface IEntity<TId> where TId : class
{
    TId Id { get; set; }
}

エンティティ実装:

public class EntityOne : IEntity<int>
{
    public int Id { get; set; }

    // Other model properties...
}

public class EntityTwo : IEntity<string>
{
    public string Id { get; set; }

    // Other model properties...
}

汎用リポジトリ インターフェース:

public interface IRepository<TEntity, TId> where TEntity : class, IEntity<TId>
{
    TEntity GetById(TId id);
}

汎用リポジトリの実装:

public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId>
    where TEntity : class, IEntity<TId>
    where TId : class
{
    // Context setup...

    public virtual TEntity GetById(TId id)
    {
        return context.Set<TEntity>().SingleOrDefault(x => x.Id == id);
    }
}

リポジトリの実装:

 public class EntityOneRepository : Repository<EntityOne, int>
    {
        // Initialise...
    }

    public class EntityTwoRepository : Repository<EntityTwo, string>
    {
        // Initialise...
    }

ベストアンサー1

RepositoryクラスからTIdの制約を削除する必要があります

public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId>
where TEntity : class, IEntity<TId>
{
    public virtual TEntity GetById(TId id)
    {
        return context.Set<TEntity>().Find(id);
    }
}

おすすめ記事