Jay*_*Jay 0 entity entity-framework entity-framework-core
我正在尝试使用 EntityFramework Core/6 与数据库交互。我希望 DbContext 类尽可能精简。我这样做的一种方法是将任何存储库构建配置移动到特定的类,如下所示
public class ProductViewConfiguration : IEntityTypeConfiguration<ProductView>
{
public void Configure(EntityTypeBuilder<ProductView> builder)
{
builder.ToTable("viewProducts");
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在尝试配置DbSet<ProductView>视图。所以我不需要跟踪这个存储库中的任何更改。所以我需要以某种方式构建/配置DbSet<>它AsNoTracking()。
如何使用EntityTypeBuilder<>构建器将 DbSet 配置为只读?
当使用要视为只读的视图时,您可以将实体属性设置器标记为protected阻止任何将来的代码期望可以设置这些实体,然后在 DbContext 本身中:
protected DbSet<ProductView> ProductViewsProtected { get; set; }
public IQueryable<ProductView> ProductViews => ProductViewsProtected.AsNoTracking();
Run Code Online (Sandbox Code Playgroud)
使用注意事项AsNoTracking是,不会跟踪从基于 ProductView 的查询返回的所有实体,因此,如果 ProductView 实体具有您想要更新的导航属性(出于任何原因),则不会跟踪这些属性。
protected提供运行时保护而不限制相关实体或 ProductView 实体可能滑入更改跟踪器的任何其他方式的另一种折衷方案是在实体中实现 setter ,然后覆盖OnSaveChangesDbContext 中的 setter 以检查插入、更新和删除的实体对于 ProductView 和/或任何其他只读视图。如果找到,则抛出异常。这些实体可以用诸如 [ReadOnlyEntity] 之类的属性来标记,您可以在提交更改之前检查该属性。您在实体内的属性设置器中有一个编译时防护,这应该阻止滥用或至少提示新开发人员提出问题。虽然主要守卫是在运行时,但如果它触发了异常,如果有人忽视了既定规则,那么团队内部将有理由进行严肃的讨论。[ReadOnlyEntity](如果他们乱搞改变,没有什么可以阻止他们删除该属性protected,并且 DbContext 可能仍然无法尝试通过视图进行更新。)最终的目标是让开发人员轻松理解所使用的模式及其原因,而不是而不是试图让他们很难犯错误。
总的来说,当涉及到实体时,我尝试使用 DDD 方法,其中对 setter 的访问受到限制。实体构造由工厂方法处理,其中构造函数的作用域是有限的internal,而大多数“复杂”更新是通过方法而不是单个属性设置器在实体中传递的。这可确保更新提供所有必要的详细信息,以确保实体始终处于有效状态。可选的独立属性/除了长度/范围/空检查之外没有复杂的验证,具有公共设置器。只读实体根本没有可见的设置器。如果开发人员接受了所使用模式的指导,那么在处理没有设置器的实体时,第一个假设应该是“这是一个只读实体”,并且至少会引发有关其需求的讨论。
| 归档时间: |
|
| 查看次数: |
4279 次 |
| 最近记录: |