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 열과 함께 Entity 열이 모두 있습니다.

내가 엔터티를 데이터베이스에 추가 할 때 마지막으로 삽입 된 행 ID를 반환하려고합니다. ID는 ID 열입니다. 아무도 이걸 도와 줄 수 없습니까?

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; 
    } 

} 

답변

4

삽입 후 당신의 CustomerDetail 개체를 확인 ID가 될 것입니다 : 당신의 엔티티 저장소 클래스를 해당 인터페이스를 구현하고 변경 확인

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

:

+0

예. 우리가 generic 저장소 클래스를 사용하고 있기 때문에 CustomerRepository에서 Override Add 함수를 추가했습니다. 그게 내 문제를 해결해 줬어. 감사 :) – PaRsH

4

당신은 같은 인터페이스를 만들어야합니다 이미 채워진

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

Marcin, 나는 CustomerRepository 클래스를 추가했습니다. 그리고 customerDetail 자체에는 ID 특성이 있습니다. – PaRsH

+0

@ Marcin, 인터페이스를 사용할 수 없다는 뜻은 아닙니다. 동적으로 또는 반사 액세스 엔티티로 액세스 할 수 있습니다. 반환 할 수 있습니다. –

관련 문제