2015-10-04 50 views
3

得出一個抽象類這是我的抽象類:可以通過數據庫類

namespace MusicStoreApp.BLL.Master 
{ 
    public abstract class Master<T> 
    { 
     MusicStoreEntities db = new MusicStoreEntities(); 
     public void Add(T item) 
     { 
      db.T.Add(item); 
      db.SaveChanges(); 
     } 
    } 
} 

這是在其他類我的目標輸出:

public class AlbumRepository : Master<Album> 
    { 
     public void Add(Album item) 
     { 
      db.Albums.Add(item); 
      db.SaveChanges(); 
     } 
    } 

public class ArtistRepository : Master<Artist> 
     { 
      public void Add(Artist item) 
      { 
       db.Artists.Add(item); 
       db.SaveChanges(); 
      } 
     } 

什麼,我特林這裏做,我應該創建一個可重用的類接口界面。所以,我可以輸入T參考的名稱,它會爲我創建其餘的代碼。

+0

查找EF和存儲庫的實現。有一個在ASP.NET網站上。 –

回答

0

感謝您對您所有的努力來回答:)的。

我發現我的答案,我希望它會幫助你太:

public abstract class RepositoryBase<T>:IRepository<T> where T:class 
{ 
    public void Add(T item) 
    { 
     db.Set<T>().Add(item); 
     db.SaveChanges(); 
    } 

    public void Update(int id,T item) 
    { 
     db.Entry(db.Set<T>().Find(id)).CurrentValues.SetValues(item); 
     db.SaveChanges(); 
    } 

    public void Delete(T item) 
    { 
     db.Set<T>().Remove(item); 
     db.SaveChanges(); 
    } 

    public List<T> SelectAll() 
    { 
     return db.Set<T>().ToList(); 
    } 

    public T SelectByID(int id) 
    { 
     return db.Set<T>().Find(id); 
    } 
} 
1

您的示例設置的方式無法正常工作,因爲T需要指向兩個不同的類(特定實例和包含該類的DbSet)。相反,試試這個:

namespace MusicStoreApp.BLL.Master 
{ 
    public abstract class Master<T> 
    { 
     MusicStoreEntities db = new MusicStoreEntities(); 
     public void Add(T item) 
     { 
      db.Entry(item).State = System.Data.Entity.EntityState.Added; 
      db.SaveChanges(); 
     } 
    } 
} 
1

你不需要這個T匿名類型。只是這樣做:如果你想使用一個存儲庫的添加剛剛從主刪除加載功能,使界面

public class Album : Master 
    public override void Add(Album item) 
    { 
     db.Albums.Add(item); 
     db.SaveChanges(); 
    } 
} 

public abstract class Master 
{ 
    public abstract void Add(Master item); 
} 

然後,你可以繼承這樣的大師並從中繼承:

public interface IMasterRepository 
{ 
    public void Add(Master item); 
} 

public class AlbumRepository : IMasterRepository 
    public override void Add(Album item) 
    { 
     db.Albums.Add(item); 
     db.SaveChanges(); 
    } 
} 

但是不要將實體類與存儲庫混合使用。

1

您在混合abstractgeneric類。前者包含一些需要由繼承者實現的內容,而後者則提供了通過某些類型的對象而不同的通用實現。從你的解釋(因爲你的「抽象」類不包含任何抽象方法),看起來像你需要一個泛型類。像這樣的東西

public class Master<T> 
{ 
    MusicStoreEntities db = new MusicStoreEntities(); 
    public void Add(T item) 
    { 
     db.Set<T>().Add(item); 
     db.SaveChanges(); 
    } 
} 

public class AlbumRepository : Master<Album> { } 
public class ArtistRepository : Master<Artist> { } 

請注意,你甚至不需要具體的類(如果這是他們應該做的)。

0

您可以使用反射來實現。

獲取屬性名稱

string PropertyName = T.GetType().Name + "s"; 

retrive的實體屬性

var property = db.GetType().Properties.Where(x => x.Name.CompareTo(PropertyName) == 0).FirstOrDefault(); 

然後使用它直接