簡體   English   中英

如何在通用存儲庫中提供實體類型/ dbset類型

[英]How to provide entity type/dbset type in Generic Repository

我在上一個線程( 如何通過名稱從上下文中選擇特定的DbSet )中討論的問題的實現上遇到問題。 我有一堂課:

public class MyObjectRepository<TEntity> : MyObjectRepository<TEntity> 
    where TEntity : MyObject
{
    private readonly DbContext _dbContext;


 public MyObjectRepository(DbContext dbContext)
 {
        _dbContext = dbContext;
 }

public bool DoesRecordExist(string id)
    {
        return _dbContext.Set<TEntity>()
           .Any(x => x.id == id);
    }
}

我也有一個具有存儲庫字段的服務類,並執行類似DoesRecordExist(string id) 我在EntityFramework上注冊了幾個類(它們每個都引用數據庫表:MyEFClass和myEFANotherClass),它們看起來像這樣:

public partial class MyEFClass: MyObject
{
}

public partial class MyEFAnotherClass: MyObject
{
}

類在這里是空的,因為我使用代碼優先& MyObject實際上具有EF類的所有字段,因此,它們是空的,並且應僅用於數據庫表之間的導航。

現在,我如何告訴上下文哪個DbSet是活動的。 例如,如何對使用MyEFClassMyEFAnotherClass通用存儲庫說? 我相信應該從服務中調用它。 我一直在嘗試從程序context.Set<something>()使用context.Set<something>()something.GetType() ,但是無論如何還是失敗了。 最后,我總是收到使用基類MyObject響應,該基類不是有效的EF DbSet(只是一個基數)。

我很高興知道您的想法或方法。

顯然,您有一個稱為service東西,它以MyObjectReposistory作為字段。 對象存儲庫具有DbContext作為字段。

service具有活動 MyObject的概念。 它知道MyEfClass還是MyOtherEfClass是活動的。

這意味着有人應該告訴您的服務哪個類是活動存儲庫。 完成此操作后,只要您想對活動的存儲庫進行操作,我們就會知道哪個存儲庫是要使用的。

通常,存儲庫旨在隱藏數據庫的真實內部結構。 因此,我不會向服務的用戶公開表的類型。

考慮使用枚舉:

enum ActiveRepository
{
    MyEfClass,
    MyOtherEfClass,
}


class Service
{
    private MyEfClass myEfRepository = ...;
    private MyEfClass myOtherRepository = ...;
    public ActiveRepository ActiveRepository {get; set;}

    private IDbSet<MyObject> GetActiveRepository()
    {
       if (this.ActiveRepository == MyEfClass)
           return this.myEfRepository;
       else
           return this.myOtherEfRepository;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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