web-dev-qa-db-ja.com

Idをさまざまなタイプにすることができる汎用GetById()を実装する方法

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

ただし、エラーが発生し続け、理由がわかりません。

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

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

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

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...
    }
12
Tomuke

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);
    }
}
7
Quentin Roger
public interface IEntity<TId> where TId : class
{
    TId Id { get; set; }
}

where TId : class制約では、すべての実装に、intなどの値型には当てはまらないオブジェクトから派生したIDが必要です。

それがエラーメッセージの内容です:The type 'int' must be a reference type in order to use it as parameter 'TId' in the generic type of method IEntity

制約を削除するだけですwhere TId : class from IEntity<TId>

4

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

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

ジェネリックパラメータの場合は、上記のようなジェネリックメソッドを作成するだけです

1
Nab