簡體   English   中英

一個抽象類,可以由數據庫類派生

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

但是不要將實體類與存儲庫混合在一起。

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

請注意,您甚至不需要具體的類(如果他們應該這樣做的話)。

您可以使用反射來完成此操作。

獲取屬性名稱

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM