C# 在存储库方法中设置新的Guid id

C# 在存储库方法中设置新的Guid id,c#,generics,repository-pattern,C#,Generics,Repository Pattern,我正在尝试实现通用存储库模式,但我的“添加”方法有一个小问题: 但我不确定如何通过泛型设置实体的Id属性 您可以让所有实体实现一个接口,并将此接口作为约束添加到T 例如: public interface IEntity { Guid Id { get; set; } } public class MyEntity : IEntity { public Guid Id { get; set; } } public class GenericRepository<T> wh

我正在尝试实现通用存储库模式,但我的“添加”方法有一个小问题:


但我不确定如何通过泛型设置实体的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();
    ...
  }
}
公共接口的可扩展性
{
Guid Id{get;set;}
}
公共类MyEntity:MyEntity
{
公共Guid Id{get;set;}
}
公共类GenericRepository,其中T类为
{
公共异步任务AddAsync(T)
{
...
T.Id=Guid.NewGuid();
...
}
}
在我看来,“通用存储库模式”是一个危险信号。存储库模式通常包含非常具体的方法,例如
getoptioncommittengusers
AddNewUser
,以防止泄漏的抽象返回给调用方并将数据层抽象掉。DbContext已经是一个非常通用的模式,因此试图围绕它包装另一个通用抽象似乎有点误导

您不能使用泛型设置属性,但如上所述,您可以使用公共接口向每个实体添加一个属性。请记住,如果表的插入量很大,则通常不建议在数据库表中使用Guid作为主键,因为它们索引不好,并且随着时间的推移会对性能产生负面影响

t.Id = Guid.NewGuid();
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();
    ...
  }
}