gpt4 book ai didi

c# - 具有基本实体接口(interface)的数据库优先

转载 作者:太空狗 更新时间:2023-10-29 23:20:34 25 4
gpt4 key购买 nike

环境:

我在 DB First Approach 工作。我的数据库中有 3 个表。所有这些表都有状态字段来指示记录状态。这是一个整数字段。

场景:

我使用数据库优先方法从该表创建了模型图。然后我为 CRUD 操作创建了一个通用的存储库接口(interface)和类。

界面如下;

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 方法中,我需要检查状态字段并只返回值 = 1

我目前的解决方案:

因为这是通用存储库,所以我无法访问方法中的字段。我们可以创建一个带有 Status 字段的基础接口(interface),然后在通用存储库中继承它,并可以在方法中使用这个字段。

如下变化;

    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;
}
}

问题:

为此,我们需要继承我所有模型的基本接口(interface)。由于模型是从数据库生成的,我手动将 IBaseEntity 添加到 edmx tt 文件中的每个模型中。

如果我的数据库有任何变化并且我再次更新图表,则删除手动添加的界面。

所以 DBFirst 中的任何其他替代方法或我的解决方案在 DB First 中都是错误的?

最佳答案

由 db-first 工具生成的类通常具有 partial 说明符。这意味着您可以通过为不同文件中的同一类添加另一个 partial 类定义来“扩展”定义(您可以控制并且不会被覆盖)。接口(interface)可以在分部类的不同部分上实现。

生成的文件:

public partial class MyEntity {} 

您的单独文件:

public partial class MyEntity : IMyInterface {} 

有关更多信息,您可以查看此 questionMSDN article on partial classes and methods .

关于c# - 具有基本实体接口(interface)的数据库优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com