实体框架类与POCO

Xmorera

我对体系结构设计有普遍的意见分歧,尽管不应使用stackoverflow征求意见,但我仍想对两种方法的优缺点进行讨论,以下将对此进行介绍:

详细信息:-C#应用程序-SQL Server数据库-使用实体框架-我们需要确定要使用哪些对象来存储信息并在整个应用程序中使用所有对象

场景1:我们将使用Entity Framework实体在我们的应用程序中传递所有内容,例如,应使用对象存储所有信息,将其传递给BL,最终我们的WepApi将采用该实体并返回值。没有DTO或POCO。

如果数据库架构更改,我们将更新实体并在使用实体的所有类中进行修改。

方案2:我们创建一个中间类-称为DTO或称为POCO-来保存应用程序所需的所有信息。有一个中间步骤,获取存储在实体中并填充到POCO中的信息,但我们将所有EF代码保留在数据访问范围内,而不是跨所有层。

每个优点和缺点是什么?

ken2k

我将使用中间类,即POCO而不是EF实体。

我看到直接使用EF实体的唯一优势是,编写代码更少...

改用POCO的优点:

您只公开应用程序实际需要的数据

基本上,说您有某种GetUsers商业方法。如果只希望用户列表填充网格(例如,您需要他们的ID,名称,名字),则可以编写如下内容:

public IEnumerable<SimpleUser> GetUsers()
{
    return this.DbContext
        .Users
        .Select(z => new SimpleUser
        {
            ID = z.ID,
            Name = z.Name,
            FirstName = z.FirstName
        })
        .ToList();
}

您的方法实际返回的结果非常清楚。现在想象一下,它返回了一个完整的User实体,其中包含所有您不想公开的导航属性和内部内容(例如Password字段)...

它确实简化了使用您的服务的人的工作

对于Create类似的业务方法,这一点更加明显您当然不希望使用User实体作为参数,对于服务的使用者来说,知道实际上需要什么属性会非常复杂...

想象以下实体:

public class User
{
    public long ID { get; set; }
    public string Name { get; set; }
    public string FirstName { get; set; }
    public string Password { get; set; }
    public bool IsDeleted { get; set; }
    public bool IsActive { get; set; }
    public virtual ICollection<Profile> Profiles { get; set; }
    public virtual ICollection<UserEvent> Events { get; set; }
}

使用该void Create(User entity);方法需要哪些属性

  • ID:不知道,也许是生成的,也许不是
  • 名称/名字:应该设置那些
  • 密码:这是纯文本密码,是哈希版本吗?它是什么?
  • IsDeleted / IsActive:我应该自己激活用户吗?是通过业务方法完成的吗?
  • 个人资料:哼...我如何影响用户的个人资料?
  • 事件:到底是什么?

它迫使您不要使用延迟加载

是的,我讨厌此功能有多种原因。他们之中有一些是:

  • 极难有效使用。我看过太多次代码会产生数千个SQL请求,因为开发人员不知道如何正确使用延迟加载
  • 异常情况很难管理。通过允许在任何时候(即,当您延迟加载时)执行SQL请求,您可以将管理数据库异常的角色委派给上层,即业务层甚至应用程序。一个坏习惯。

使用POCO会迫使您急于加载实体,这是更好的IMO。

关于AutoMapper

AutoMapper是一个工具,可用于将实体自动转换为POCO,反之亦然。我也不喜欢它。参见https://stackoverflow.com/a/32459232/870604

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MVVM和实体框架中POCO类的含义

来自分类Dev

WPF中的实体框架POCO类和ViewModel

来自分类Dev

实体框架POCO中的枚举

来自分类Dev

我是否需要在实体框架6中使用POCO类

来自分类Dev

实体框架4 / POCO-从哪里开始?

来自分类Dev

实体框架中的POCO是什么?

来自分类Dev

实体框架基类

来自分类Dev

具有Postgres数据库和适当大小写的C#POCO类(不使用实体框架)

来自分类Dev

DDD和实体框架类

来自分类Dev

要绘制的实体框架类

来自分类Dev

实体框架 + MySQL 类生成

来自分类Dev

实体框架排除字段查询计数和POCO最佳方法

来自分类Dev

实体框架T4:POCO是否实现通用接口?

来自分类Dev

实体框架在类中嵌套类

来自分类Dev

实体框架多对一关系与 POCO 在第二个实体中生成 FK

来自分类Dev

实体框架代码优先:如何忽略类

来自分类Dev

实体框架未生成表或过程的类

来自分类Dev

实体框架生成的类的数据注释

来自分类Dev

实体框架5-扩展DBContext类

来自分类Dev

实体框架7分类

来自分类Dev

实体框架和可移植类库

来自分类Dev

每个类继承的实体框架表

来自分类Dev

实体框架级联删除继承的类

来自分类Dev

实体框架类类型属性以蛇案

来自分类Dev

实体框架:获取EntityType类的名称

来自分类Dev

类库中的实体框架 Null

来自分类Dev

无法访问类中的实体框架实体

来自分类Dev

使用Automapper将实体框架类映射到业务类

来自分类Dev

使用实体框架反向POCO生成器按表继承