C# REST服务中的数据层

C# REST服务中的数据层,c#,json,database,rest,C#,Json,Database,Rest,我想知道如何设计一个REST服务,使我的数据访问层(与数据库对话的持久层)和我的“业务”实体能够很好地分开。我所说的“业务”实体是指返回给客户机的对象,例如JSON 主要的一点是,数据库不支持任何OO语言支持的所有奇特类型,例如enum。相反,数据库使用的是普通的字符串和ints等。JSON的另一面也是一样的。只有原语反序列化它 现在,假设我的数据模型(“业务”实体)定义如下: Employee.cs 这里,DepartmentCode和EmployeeGender都是枚举。例如: 部门代码.c

我想知道如何设计一个
REST
服务,使我的数据访问层(与数据库对话的持久层)和我的“业务”实体能够很好地分开。我所说的“业务”实体是指返回给客户机的对象,例如JSON

主要的一点是,数据库不支持任何OO语言支持的所有奇特类型,例如
enum
。相反,数据库使用的是普通的
字符串
ints
等。JSON的另一面也是一样的。只有原语反序列化它

现在,假设我的数据模型(“业务”实体)定义如下:

Employee.cs

这里,
DepartmentCode
EmployeeGender
都是枚举。例如:

部门代码.cs

但是,在数据库中,
Gender
被定义为
int
。其思想是0表示男性,1表示女性,2表示未定义。类似地,
DepartmentCode
被定义为字符串(
VARCHAR

现在,我的想法是让另一个数据模型的类型与数据库对应,这意味着它不再有那些
枚举
,而是直接有
字符串
整数
。如下所示:

EmployeeDb.cs

我首先使用枚举的原因是,我希望避免一些“垃圾”值在我的服务周围浮动。但是枚举在数据库中使用是非常不实际的,代码中必须有一个转换发生的地方

一般来说,我的问题是,这种转换应该发生在哪里。更重要的是,用具有这些枚举的“复杂”模型定义我的服务API有意义吗?或者我应该坚持使用普通的字符串和int字段

通信方式如下:
JSON——数据模型(层?)——数据库
。在这里,
JSON
Database
都使用非常原始的类型,而在我的代码中,我希望有一些更复杂的逻辑。因此,转换可能需要进行两次。一旦进入GET请求:从数据库到JSON。一旦进入POST请求:从JSON到数据库


这些东西通常是如何设计的?关于API是如何定义的,以及转换数据库API是如何定义的?

在应用程序和数据库之间,您要处理的是将逻辑数据模型映射到物理数据模型。这通常是通过实体框架或NHibernate等框架实现的。它们是ORM框架。当然,你也可以自己做


至于业务逻辑和服务接口之间的关系,请查看数据传输对象或DTO。它们是以实际类的扁平或简化形式在服务之间进行数据通信的常用方式。可以使用手工编写的映射方法或使用Automapper之类的工具来实现它们之间的映射。

在应用程序和数据库之间,您需要处理逻辑数据模型到物理数据模型的映射。这通常是通过实体框架或NHibernate等框架实现的。它们是ORM框架。当然,你也可以自己做


至于业务逻辑和服务接口之间的关系,请查看数据传输对象或DTO。它们是以实际类的扁平或简化形式在服务之间进行数据通信的常用方式。可以使用手工编写的映射方法或使用Automapper之类的工具进行映射。

我不知道您正在使用的2017年没有enum的数据库,也许您应该将其更改为postgres,在那里您可以创建自己的数据类型我不知道您正在使用的2017年没有enum的数据库,也许你应该把它改成postgres,在那里你可以创建自己的数据类型
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string BirthPlace { get; set; }

    public EmployeeGender Gender { get; set; }

    public string OIB { get; set; }

    public string CurrentPlace { get; set; }

    public DepartmentCode Department { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public enum DepartmentCode
{
    UNKNOWN,
    D_21510,
    D_21520,
    D_21540,
    D_21570,
    D_SLFIN,
    D_SLKPO
}
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string BirthPlace { get; set; }

    public int Gender { get; set; }

    public string OIB { get; set; }

    public string CurrentPlace { get; set; }

    public string Department { get; set; }