3

我对这个存储库模式不熟悉。存储库中有以下方法。使用存储库模式获取上次插入的行ID

public abstract class Repository<T> : IRepository<T> where T : class 
    { 
     private PHOnlineEntities dataContext; 
     private readonly IDbSet<T> dbset; 

     protected Repository(IDatabaseFactory databaseFactory) 
     { 
      DatabaseFactory = databaseFactory; 
      dbset = DataContext.Set<T>(); 
     } 

     protected IDatabaseFactory DatabaseFactory 
     { 
      get; 
      private set; 
     } 

     protected PHOnlineEntities DataContext 
     { 
      get { return dataContext ?? (dataContext = DatabaseFactory.Get()); } 
     } 

     public virtual int Add(T entity) 
     { 
      dbset.Add(entity); 
      dataContext.SaveChanges(); 

      // return id here 
     } 

     public virtual void Update(T entity) 
     { 
      dbset.Attach(entity); 
      dataContext.Entry(entity).State = EntityState.Modified; 
     } 


     public virtual void Delete(T entity) 
     { 
      dbset.Remove(entity); 
     } 

     public virtual void Delete(Expression<Func<T, bool>> where) 
     { 
      IEnumerable<T> objects = dbset.Where<T>(where).AsEnumerable(); 
      foreach (T obj in objects) 
       dbset.Remove(obj); 
     } 

     public virtual T GetById(long id) 
     { 
      return dbset.Find(id); 
     } 

     public virtual T GetById(string id) 
     { 
      return dbset.Find(id); 
     } 

     public virtual IEnumerable<T> GetAll() 
     { 
      return dbset.ToList(); 
     } 

     public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where) 
     { 
      return dbset.Where(where).ToList(); 
     } 

     public T Get(Expression<Func<T, bool>> where) 
     { 
      return dbset.Where(where).FirstOrDefault<T>(); 
     } 

这是我CustomerRepository类

public interface ICustomerDetailRepository : IRepository<CustomerDetail> 
    { 
    } 

    /// <summary> 
    /// CustomerDetail repository 
    /// </summary> 
    public class CustomerDetailRepository : Repository<CustomerDetail>, ICustomerDetailRepository 
    { 
     /// <summary> 
     /// 
     /// </summary> 
     private PHOnlineEntities _dataContext; 

     /// <summary> 
     /// 
     /// </summary> 
     protected IDatabaseFactory DatabaseFactory 
     { 
      get; 
      private set; 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="databaseFactory"></param> 
     public CustomerDetailRepository(IDatabaseFactory databaseFactory) 
      : base(databaseFactory) 
     { 
      DatabaseFactory = databaseFactory; 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     protected PHOnlineEntities DataContext 
     { 
      get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); } 
     } 
    } 

为CustomerDetail类包含模型。它具有所有实体列和ID列。

当我添加实体到数据库,我想返回最后插入的行ID。 Id是标识列。任何人都可以帮助我吗?

回答

4

检查插入后,您为CustomerDetail对象,该ID将已填充

public class CustomerDetail 
{ 
    public int Id{ get; set; } 
    public string Name{ get; set; } 
    public string Address{ get; set; } 
} 
var customerDetail = new CustomerDetail { Name = "Bubbles", Address = "1 way, city" } 
customerDetailRepository.Add(customerDetail) 

Console.WriteLine(customerDetail.Id); // This is the identity value 
+0

是的。由于我们正在使用通用库类,因此我在CustomerRepository中添加了Override Add函数。这解决了我的问题。谢谢 :) – PaRsH

4

你必须创建这样一个接口:

public interface IEntity 
{ 
    public int Id { get; set;} 
} 

让你的实体实现该接口,并改变你的仓储类:

public abstract class Repository<T> : IRepository<T> where T : class, IEntity 
{ 

    (...) 

    public virtual int Add(T entity) 
    { 
     dbset.Add(entity); 
     dataContext.SaveChanges(); 

     // return id here 
     return entity.Id; 
    } 

} 
+0

Marcin,我已添加CustomerRepository类。而customerDetail本身包含了ID特性。 – PaRsH

+0

@ Marcin,不代表你不能使用界面。您可以动态地或通过反射访问entity.Id来返回它。 –