[英]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.