可以由数据库 classes 导出的摘要 class
An abstract class which can be derived by database classes
这是我的摘要class:
namespace MusicStoreApp.BLL.Master
{
public abstract class Master<T>
{
MusicStoreEntities db = new MusicStoreEntities();
public void Add(T item)
{
db.T.Add(item);
db.SaveChanges();
}
}
}
这是我在其他 classes:
中的目标输出
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();
}
}
我想在这里做的是,我应该创建一个类似可重用的界面 class。因此,我只需键入 T 引用的名称,它将为我创建其余代码。
您的示例设置方式无法正常工作,因为 T 需要指向两个不同的 classes(特定实例和包含该 class 的 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 中删除添加功能并创建接口并继承它:
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
class。前者包含一些需要由继承者实现的东西,而后者提供因所涉及对象的某些类型而不同的通用实现。根据您的解释(并且由于您的 "abstract" class 不包含任何抽象方法),看起来您需要一个通用的 class。像这样
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> { }
请注意,您甚至不需要具体的 classes(如果这就是他们应该做的)。
你可以使用反射来做到这一点。
得到属性名字
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);
}
}
这是我的摘要class:
namespace MusicStoreApp.BLL.Master
{
public abstract class Master<T>
{
MusicStoreEntities db = new MusicStoreEntities();
public void Add(T item)
{
db.T.Add(item);
db.SaveChanges();
}
}
}
这是我在其他 classes:
中的目标输出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();
}
}
我想在这里做的是,我应该创建一个类似可重用的界面 class。因此,我只需键入 T 引用的名称,它将为我创建其余代码。
您的示例设置方式无法正常工作,因为 T 需要指向两个不同的 classes(特定实例和包含该 class 的 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 中删除添加功能并创建接口并继承它:
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
class。前者包含一些需要由继承者实现的东西,而后者提供因所涉及对象的某些类型而不同的通用实现。根据您的解释(并且由于您的 "abstract" class 不包含任何抽象方法),看起来您需要一个通用的 class。像这样
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> { }
请注意,您甚至不需要具体的 classes(如果这就是他们应该做的)。
你可以使用反射来做到这一点。
得到属性名字
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);
}
}