I am trying to implement a generic GetById(T id)
method which will cater for types which may have differing ID types. In my example, I have an entity which has an ID of type int
, and one of type string
.
However, I keep getting an error and I have no idea why:
The type 'int' must be a reference type in order to use it as parameter 'TId' in the generic type of method IEntity
Entity Interface:
To cater for my domain models which can have Id's of type int
or string
.
public interface IEntity<TId> where TId : class
{
TId Id { get; set; }
}
Entity Implementations:
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...
}
Generic Repository Interface:
public interface IRepository<TEntity, TId> where TEntity : class, IEntity<TId>
{
TEntity GetById(TId id);
}
Generic Repository Implementation:
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);
}
}
Repository Implementations:
public class EntityOneRepository : Repository<EntityOne, int>
{
// Initialise...
}
public class EntityTwoRepository : Repository<EntityTwo, string>
{
// Initialise...
}
You should remove the constraint on TId from your Repository
class
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);
}
}
public interface IEntity<TId> where TId : class
{
TId Id { get; set; }
}
The where TId : class
constraint requires every implementation to have a Id which derives from object which is not true for value types like int.
Thats what the error message tells you: The type 'int' must be a reference type in order to use it as parameter 'TId' in the generic type of method IEntity
Just remove the constraint where TId : class
from IEntity<TId>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With