我正在使用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);
}
}
答案 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
}