我试图实现通用的存储库模式,我的问题与我的#34; Add"方法:
public class GenericRepository<T> where T : class
{
private readonly DbContext _context;
private DbSet<T> DbSet;
public async Task AddAsync(T t)
{
_context.Set<T>().Add(t);
await _context.SaveChangesAsync();
}
}
这种方法有效,但是因为&#34; Id&#34;我的实体的属性是Guid我把所有的零都称为Id。
所以在我的方法中,我应该将新的Guid设置为Id:
t.Id = Guid.NewGuid();
但我不确定如何通过泛型设置我的实体的Id属性。
答案 0 :(得分:1)
您可以让所有实体实现一个接口,并将此接口添加为T
上的约束。
例如:
public interface IEntity
{
Guid Id { get; set; }
}
public class MyEntity : IEntity
{
public Guid Id { get; set; }
}
public class GenericRepository<T> where T class, IEntity
{
public async Task AddAsync (T t)
{
...
T.Id = Guid.NewGuid();
...
}
}
答案 1 :(得分:0)
“通用存储库模式”的想法在我的脑海中是一个红旗。存储库模式通常包含非常具体的方法,例如GetTopTenContributingUsers
或AddNewUser
,以防止泄漏抽象回到调用者并抽象数据层。 DbContext是一个非常通用的模式,因此试图在它周围包含另一个通用抽象似乎有点误导。
您不能使用泛型设置属性,但是@MotoSV表示您可以使用通用接口向每个实体添加一个属性。请记住,如果您的表格插入较重,那么通常不鼓励使用Guid作为数据库表中的主键,因为它们不能很好地编制索引,并且随着时间的推移会对性能产生负面影响。