一个抽象类,可以由数据库类派生

时间:2015-10-04 17:22:10

标签: c# class abstract-class implementation

这是我的抽象类:

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参考的名称,它就会为我创建其余的代码。

5 个答案:

答案 0 :(得分: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 :(得分:1)

您不需要此T匿名类型。做这样的事情:

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

然后你可以像这样继承主人:

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

但不要将实体类与存储库混合。

答案 2 :(得分:1)

您正在将abstractgeneric类混合。前者包含需要由继承者实现的内容,而后者提供的通用实现因所涉及对象的某些类型而不同。从你的解释(因为你的&#34;抽象&#34;类不包含任何抽象方法),看起来你需要一个泛型类。像这样的东西

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

请注意,您甚至不需要具体课程(如果他们应该这样做的话)。

答案 3 :(得分:0)

您可以使用反射来实现。

获取属性名称

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

检索实体属性

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

然后直接使用

答案 4 :(得分: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);
    }
}