环境:
我在DB First Approach工作.我的数据库中有3个表.所有这些表都有状态字段以指示记录状态.这是一个整数字段.
场景:
我使用db first方法从该表创建了模型图.然后我为CRUD操作创建了一个通用的存储库接口和类.
以下是界面;
public interface IGenericRepository<T> where T : class
{
IQueryable<T> GetAll();
Task<T> GetAsync(int id);
void Add(T entity);
void Delete(T entity);
void Edit(T entity);
Task<bool> SaveAsync();
}
以下是通用的Repository类
public abstract class GenericRepository<C, T> :
IGenericRepository<T> where T : class
where C : MyDBContext, new()
{
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query;
}
//Removed other methods for clarity
}
需求:
在GetAll方法中,我需要检查状态字段并仅返回value = 1
目前的解决方案我有:
由于这是通用存储库,我无法访问方法中的字段.
我们可以使用Status字段创建一个基本接口,然后在通用存储库中继承它,并可以在该方法中使用该字段.
变化如下;
public interface IGenericRepository<T> where T : class, IBaseEntity
{
//Methods removed for clarity
}
public abstract class GenericRepository<C, T> :
IGenericRepository<T> where T : class, IBaseEntity
where C : MyDBContext, new()
{
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>().Where(x => x.Status== 1);
return query;
}
}
问题:
为此,我们需要继承所有模型的基接口.由于模型是从Database生成的,我手动将IBaseEntity添加到edmx tt文件中的每个模型中.
如果我的数据库有任何更改并且我再次更新了图表,则删除了manaully添加的界面.
因此DB First中的任何其他替代方法或我的解决方案在DB First中是错误的吗?
最佳答案 db-first工具生成的类通常具有部分说明符.这意味着您可以通过在不同的文件中为同一个类添加另一个部分类定义来“扩展”定义(您控制并且不会被覆盖).接口可以在部分类的不同部分上实现.
生成的文件:
public partial class MyEntity {}
你的单独文件:
public partial class MyEntity : IMyInterface {}
有关详细信息,请参阅此question或MSDN article on partial classes and methods.