[英]An abstract class which can be derived by database classes
這是我的抽象類:
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引用的名稱,它就會為我創建其余的代碼。
您的示例設置方式無法正常工作,因為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();
}
}
}
您不需要此T匿名類型。 做這樣的事情:
public abstract class Master
{
public abstract void Add(Master item);
}
那么你可以像這樣繼承Master:
public class Album : Master
public override void Add(Album item)
{
db.Albums.Add(item);
db.SaveChanges();
}
}
如果要使用存儲庫進行添加,只需從master中刪除add函數並生成接口並從中繼承:
public interface IMasterRepository
{
public void Add(Master item);
}
public class AlbumRepository : IMasterRepository
public override void Add(Album item)
{
db.Albums.Add(item);
db.SaveChanges();
}
}
但是不要將實體類與存儲庫混合在一起。
您正在將abstract
與generic
類混合在一起。 前者包含需要由繼承者實現的內容,而后者提供的通用實現因所涉及對象的某些類型而不同。 從你的解釋(因為你的“抽象”類不包含任何抽象方法),看起來你需要一個泛型類。 像這樣的東西
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> { }
請注意,您甚至不需要具體的類(如果他們應該這樣做的話)。
您可以使用反射來完成此操作。
獲取屬性名稱
string PropertyName = T.GetType().Name + "s";
檢索實體屬性
var property = db.GetType().Properties.Where(x => x.Name.CompareTo(PropertyName) == 0).FirstOrDefault();
然后直接使用它
感謝您的所有努力回答:)。
我找到了答案,我希望它也能幫助你:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.