【问题标题】:Set new Guid id in Repository method在 Repository 方法中设置新的 Guid id
【发布时间】:2018-01-02 20:59:39
【问题描述】:

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

  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 属性。

【问题讨论】:

    标签: c# generics repository-pattern


    【解决方案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();
        ...
      }
    }
    

    【讨论】:

      【解决方案2】:

      “通用存储库模式”的想法在我看来是一个危险信号。存储库模式通常包含非常具体的方法,例如GetTopTenContributingUsersAddNewUser,以防止泄漏抽象回调用者并将数据层抽象掉。 DbContext 已经是一种非常通用的模式,因此尝试围绕它包装另一个通用抽象似乎有点误导。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2020-12-23
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多