具有基本实体接口的数据库优先
DB First with Base Entity Interface
环境:
我正在使用 DB First Approach。我的数据库中有 3 个 table。所有这些 tables 都有状态字段来指示记录状态。这是一个整数字段。
场景:
我使用数据库优先方法从这个 table 创建了模型图。然后我创建了一个通用存储库接口和 class 用于 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();
}
下面是通用的Repositoryclass
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 方法中,我需要检查状态字段并且 return 只有值 = 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;
}
}
问题:
为此,我们需要继承我所有模型的基本接口。由于模型是从数据库生成的,我手动将 IBaseEntity 添加到 edmx tt 文件中的每个模型中。
如果我的数据库有任何变化,并且我再次更新了图表,则删除了手动添加的界面。
所以 DBFirst 中的任何其他替代方法或我的解决方案在 DB First 中都是错误的?
由 db-first 工具生成的 classes 通常具有 partial
说明符。这意味着您可以 "extend" 通过为不同文件中的相同 class 添加另一个 partial
class 定义来 "extend" 定义(您控制并且不会被覆盖)。接口可以在部分 class 的单独部分上实现。
生成的文件:
public partial class MyEntity {}
您的单独文件:
public partial class MyEntity : IMyInterface {}
有关详细信息,请参阅此 question or the MSDN article on partial classes and methods。
环境:
我正在使用 DB First Approach。我的数据库中有 3 个 table。所有这些 tables 都有状态字段来指示记录状态。这是一个整数字段。
场景:
我使用数据库优先方法从这个 table 创建了模型图。然后我创建了一个通用存储库接口和 class 用于 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();
}
下面是通用的Repositoryclass
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 方法中,我需要检查状态字段并且 return 只有值 = 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;
}
}
问题:
为此,我们需要继承我所有模型的基本接口。由于模型是从数据库生成的,我手动将 IBaseEntity 添加到 edmx tt 文件中的每个模型中。
如果我的数据库有任何变化,并且我再次更新了图表,则删除了手动添加的界面。
所以 DBFirst 中的任何其他替代方法或我的解决方案在 DB First 中都是错误的?
由 db-first 工具生成的 classes 通常具有 partial
说明符。这意味着您可以 "extend" 通过为不同文件中的相同 class 添加另一个 partial
class 定义来 "extend" 定义(您控制并且不会被覆盖)。接口可以在部分 class 的单独部分上实现。
生成的文件:
public partial class MyEntity {}
您的单独文件:
public partial class MyEntity : IMyInterface {}
有关详细信息,请参阅此 question or the MSDN article on partial classes and methods。