在存储库中而不是在MVC控制器中创建新GUID

时间:2017-06-14 10:39:18

标签: c# asp.net-mvc repository-pattern guid

我正在使用udemy视频的指令创建一个新的MVC解决方案。教师使用存储库模式与模型交互,但他使用int。另一方面,我使用Guid,他没有展示。我知道虽然int是自动创建的,但我需要像在这里一样明确地创建Guid:

[HttpPost]
public ActionResult CreateCarrier(Carrier carrier)
{
      carrier.CarrierID = System.Guid.NewGuid();
      carriers.Insert(carrier);
      carriers.Commit();

      return RedirectToAction("CarrierList");
}

但是,由于我有很多课程,我认为这将是很多额外的代码。在我插入之前,我不能为实体ID创建Guid吗?我只是无法弄清楚如何在存储库中执行此操作。这是存储库代码:

public abstract class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity : class
{
    internal DataContext context;
    internal DbSet<TEntity> dbSet;
    public virtual void Insert(TEntity entity)
    {
         dbSet.Add(entity);
    }
}

这是界面:

namespace WarehouseScheduling.DAL.Contracts
{
    public interface IRepositoryBase<TEntity> where TEntity : class
    {
        void Commit();
        void Delete(TEntity entity);
        void Delete(object id);
        void Dispose();
        IQueryable<TEntity> GetAll();
        IQueryable<TEntity> GetAll(object filter);
        TEntity GetById(object id);
        TEntity GetFullObject(object id);
        IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
        void Insert(TEntity entity);
        void Update(TEntity entity);
    }
}

1 个答案:

答案 0 :(得分:0)

你可以强制通用类型TEntity成为允许获取和设置Guid的接口

public interface IHasGuid
{
    Guid Id { get; set; }
}

然后,您可以对存储库类/接口进行限制,以便它只适用于IHasGuid类型的实体

namespace WarehouseScheduling.DAL.Contracts
{
    public interface IRepositoryBase<TEntity> where TEntity : IHasGuid
    {
        void Commit();
        void Delete(TEntity entity);
        void Delete(object id);
        void Dispose();
        IQueryable<TEntity> GetAll();
        IQueryable<TEntity> GetAll(object filter);
        TEntity GetById(object id);
        TEntity GetFullObject(object id);
        IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
        void Insert(TEntity entity);
        void Update(TEntity entity);
    }
}

并同样修改实现,但添加代码以自动添加Guid

public abstract class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity : IHasGuid
{
    internal DataContext context;
    internal DbSet<TEntity> dbSet;
    public virtual void Insert(TEntity entity)
    {
         entity.Id = new Guid();
         dbSet.Add(entity);
    }
}

请记住,您的实体(本例中为运营商)必须实施IHasGuid

public class Carrier : IHasGuid
{
    public Guid Id { get; set; }
    // other fields below
}