c# - 如何将 Entity(EF) 和 EntityDTO 与 Contract(Interface) 一起使用

标签 c# entity-framework data-access-layer dto bll

我在 DAL 中有一个实体 (EF),它是由 Entity Framework 生成的。

public partial class User : IUser
{
    public Guid Id { get; set; }

    [Required]
    [StringLength(20)]
    public string Login { get; set; }

    [Required]
    [StringLength(25)]
    public string Password { get; set; }

    [Required]
    [StringLength(50)]
    public string Email { get; set; }

    [StringLength(30)]
    public string Lastname { get; set; }

    [StringLength(30)]
    public string Firstname { get; set; }

    [StringLength(200)]
    public string Avatar { get; set; }

    public Guid? DepartmentId { get; set; }
    public Guid? RoleId { get; set; }
    public virtual Department Department { get; set; }
    public virtual Role Role { get; set; }
}

我已经在 BLL 中创建了 UserDto

public class UserDto : IUser
{
    public Guid Id { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public string Lastname { get; set; }
    public string Firstname { get; set; }
    public string Avatar { get; set; }
    public DepartmentDto Department { get; set; }
    public RoleDto Role { get; set; }
    public Guid? DepartmentId { get; set; }
    public Guid? RoleId { get; set; }
}

要在 DAL 和 BLL 之间传输数据,我正在使用 Contract(Interface)

public interface IUser
{
    Guid Id { get; set; }
    string Login { get; set; }
    string Password { get; set; }
    string Email { get; set; }
    string Lastname { get; set; }
    string Firstname { get; set; }
    string Avatar { get; set; }
}

在这种情况下,如何在 DAL 和 BLL 之间传输导航字段?像这样:

public virtual Department Department { get; set; }
public virtual Role Role { get; set; } 

怎么做更好:

移除合约(接口(interface))并将User(EF)直接转移到BLL或建议解决方案来解决这个问题。 从架构的角度移除契约(接口(interface))是否正确?

最佳答案

创建 DTO 的最重要目的是让你的 DomainModel 与你的 DAL DTO Model 脱钩。 那么再通过一个接口(interface)将它们耦合起来就完全不对了。

我建议您使用与您的 DomainModel 相同的 EF 模型并在您的 BLL 中使用它,除非您有一个大型和复杂的项目,然后通过拥有真正丰富的 DomainModel 来更严格地执行 DDD 是可以的。

在那种情况下,您应该将您的 DomainModel 传递给您的 DAL,仅此而已,所有映射都应该在您的 DAL 的内部。然后您可以使用一些工具,例如 AutoMapper 或只是手动映射

关于c# - 如何将 Entity(EF) 和 EntityDTO 与 Contract(Interface) 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576435/

相关文章:

c# - 通过导入将 XSD 转换为 XML

c# - 计算内部列表中存在的元素数

c# - 不使用ORM的N层数据库应用程序,UI如何指定需要显示的数据?

c# - 如何使用 linq to entities 获取字符串数组或 JSON 格式的数据?

javascript - jQuery API 调用 Entity Framework API Put 方法

sql - 我们是否有数据库访问层可以轻松切换到 Scala 中的其他数据库

design-patterns - 交易脚本是反模式吗?

c# - 替换数组中的值

c# - 使用 .net 4.0 测试程序集测试 .net 3.5 程序集时的风险有多大

c# - 为什么我无法访问我的对象模型的属性?