具有基本实体接口的数据库优先

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