在 Repository 方法中设置新的 Guid id

Set new Guid id in Repository method

我正在尝试实现通用存储库模式,但我的 "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();
    }
   }

此方法有效,但由于我的实体的 "Id" 属性 是 Guid,所以我将所有零作为 Id。

所以在我的方法中,我应该将新的 Guid 设置为 Id:

t.Id = Guid.NewGuid();

但我不确定如何通过泛型设置实体的 ID 属性。

您可以让所有实体实现一个接口并将此接口添加为对 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();
    ...
  }
}

"generic repository pattern" 的想法在我心中是一个危险信号。存储库模式通常包含非常具体的方法,例如 GetTopTenContributingUsersAddNewUser,以防止抽象泄漏回调用者并将数据层抽象掉。 DbContext 已经是一个非常通用的模式,因此试图围绕它包装另一个通用抽象从表面上看似乎有点误入歧途。

你不能设置一个属性使用泛型,但正如所说,你可以使用通用的方式为你们每个实体添加一个界面。请记住,如果您的 table 是大量插入的,那么通常不鼓励使用 Guid 作为数据库 table 中的主键,因为它们不能很好地建立索引并且随着时间的推移会对性能产生负面影响。