Cyc*_*eak 6 c# entity-framework repository-pattern
我试图抓住模式存储库的想法,并尝试在我已经设置的数据库结构中实现它.我现在正在努力获得使用查找表的最佳实践.我已经创建了一个测试项目,这是我的数据库模型:

您可以看到我有三个查找表:Lookup,Language和LookupLanguage.语言表只包含语言.

查找表包含整个模型中使用的不同类型.

LookupLanguage将两个表链接在一起:

我已经创建了一个新项目,所有模型都是1到1的数据库表:

我还创建了一个通用存储库和一个通用的CrudService接口:
public interface ICrudService<T> where T : IsActiveEntity, new()
{
int Create(T item);
void Save();
void Delete(int id);
T Get(int id);
IEnumerable<T> GetAll();
IEnumerable<T> Where(Expression<Func<T, bool>> func, bool showDeleted = false);
void Restore(int id);
}
Run Code Online (Sandbox Code Playgroud)
现在,根据以下帖子:在实现存储库模式时应该查找值/表获取自己的存储库吗?,存储库应隐藏底层数据库层.所以我认为我需要一个服务和/或存储库的新实现来获取查找,但是,我在哪里必须告诉我需要哪种语言进行查找?
让我们从公司的状态(新的,接受的,拒绝的)作为例子.
公司模式如下:
public partial class Company : IsActiveEntity
{
[Required]
[MaxLength(50)]
public string CompanyName { get; set; }
public System.Guid StatusGuid { get; set; }
[ForeignKey("StatusGuid")]
public virtual Lookup Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想我不需要单独实现存储库?但我需要一个单独的实现CompanyService.
interface ICompanyService : ICrudService<Company>
{
IQueryable<LookupLanguage> GetStatuses(Guid languageguid);
LookupLanguage GetStatus(Guid statusguid, Guid languageguid);
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法,还是我错过了什么?
由于您的表架构和维护视角,在您的案例中创建通用 LookupRepository 是一个更好的选择。
我不确定您是否同时使用服务定位器和存储库模式,或者只是因为名称而使用存储库ICompanyService。但无论如何,我同意存储库不应始终代表表 1-1,但大多数时候它们确实代表表 1-1。
您提供的 SO 链接的表结构与您的不同。您有一个通用查找表,而链接对于每个查找都有一个单独的表。如果您有单独的表,则将查找存储库方法与实体存储库结合使用是有意义的,因为您将有一个单独的代码来为每个查找获取数据(因为它们具有具有不同架构的单独表)。
但在您的情况下,您有一个表存储每种语言的所有查找类型,并且有一个 LookupRepository 根据 Language 和 LookupType 返回所有各种类型的查找是有意义的。如果您在单独的实体存储库中创建每个查找方法(例如 CompanyRepository 中的 GetStatuses 和 ContactRepository 中的 GetStatuses),则必须为每个存储库重复方法中的逻辑。
想想如果您更改查找表的架构(例如添加一列)并且您想要测试所有使用查找的地方,如果您到处都有查找方法,那么这将是一场噩梦,而如果您在 LookupRepository 中有一种方法,那么这将非常容易。
interface ILookupService : ICrudService<Lookup>
{
IQueryable<Lookup> GetStatuses(Guid languageguid, LookupType lookupType);
Lookup GetStatus(Guid statusguid, Guid languageguid, LookupType lookupType);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2706 次 |
| 最近记录: |