【问题标题】:An abstract class which can be derived by database classes可以由数据库类派生的抽象类
【发布时间】:2015-10-04 17:22:09
【问题描述】:

这是我的抽象类:

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

【问题讨论】:

  • 查找 EF 和存储库实现。 ASP.NET 网站上有一个。

标签: c# class abstract-class implementation


【解决方案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();
        }
    }
}

【讨论】:

    【解决方案2】:

    你不需要这个 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();
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      您正在将 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> { }
      

      请注意,您甚至不需要具体的类(如果这就是他们应该做的全部)。

      【讨论】:

        【解决方案4】:

        您可以通过使用反射来做到这一点。

        获取属性名称

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

        检索实体属性

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

        然后直接使用它

        【讨论】:

          【解决方案5】:

          感谢您为回答所做的所有努力:)。

          我找到了答案,希望对你也有帮助:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-11
            • 2011-02-01
            • 2021-03-17
            • 1970-01-01
            • 2011-01-11
            • 2021-08-04
            • 2018-09-12
            • 1970-01-01
            相关资源
            最近更新 更多