在Repository方法中设置新的Guid id

时间:2018-01-02 20:59:39

标签: c# generics repository-pattern

我试图实现通用的存储库模式,我的问题与我的#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属性。

2 个答案:

答案 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)

“通用存储库模式”的想法在我的脑海中是一个红旗。存储库模式通常包含非常具体的方法,例如GetTopTenContributingUsersAddNewUser,以防止泄漏抽象回到调用者并抽象数据层。 DbContext是一个非常通用的模式,因此试图在它周围包含另一个通用抽象似乎有点误导。

您不能使用泛型设置属性,但是@MotoSV表示您可以使用通用接口向每个实体添加一个属性。请记住,如果您的表格插入较重,那么通常不鼓励使用Guid作为数据库表中的主键,因为它们不能很好地编制索引,并且随着时间的推移会对性能产生负面影响。