如何在 Entity Framework ASP.NET Web API 中将域模型的自动增量 ID 映射到实体模型
How to map auto increment Id from domain model to entity model in Entity Framework ASP.NET Web API
我正在尝试为我当前的项目遵循 DDD。我的问题专门针对包含我的域模型值的 POST 请求。为简化起见,假设以下是我的域模型:
class Person
{
public int Id {get, set};
public string name {get, set};
}
下面是支持域的实体模型:
class PersonEF
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get, set};
public string name {get, set};
}
现在,当我收到 POST 创建新 Person 的请求时,它不包含应该由数据库生成的 ID。我首先使用 AutoMapper 将 Person 映射到 PersonEF,AutoMapper 在 PersonEF 中将 Id 设置为 0,因此数据库中的 INSERT 失败。因此,要解决这些问题,我的选择是:
将 Id 命名为 Person 中的其他名称。如果我这样做,那么我将不得不为 GET 请求的 Id 编写自定义映射。
使 Id 在 Person 和 PersonEF 中都可以为空(int?),这样自动递增就可以了,但是将 key 作为 nullable int 本身听起来并不是一个好主意。
所以请建议最好的方法。
编辑
我的错。缺少代码 context.SaveOrUpdate()。我添加了它并且它按预期工作。
很难确定,因为您应该发布的最重要的代码是您的控制器操作中发生映射和保存的代码。但是,我可以告诉您 0
是 整数的默认值。这不是由于 AutoMapper 或一般的映射本身。新创建的实体,没有任何其他交互,仍然会有 0
作为 id。
因此,这应该不会导致保存实体出现问题,否则您将永远无法保存任何具有 int PK 的实体。但是,根据 Entity Framework 认为您尝试对实体执行的操作,它可能会导致问题。也就是说,您需要确保 Entity Framework 知道您想要 创建 这个实体,而不仅仅是更新它。通常,只需将其添加到 DbSet
:
即可实现
db.PersonEFs.Add(personEF);
不确定为什么你需要比这更进一步,但如果由于某种原因这不起作用,你可以更明确一点:
db.Entry(personEF).State = EntityState.Added;
但是,实际上,如果您需要这样做,还有其他事情需要您进行掩饰。
我正在尝试为我当前的项目遵循 DDD。我的问题专门针对包含我的域模型值的 POST 请求。为简化起见,假设以下是我的域模型:
class Person
{
public int Id {get, set};
public string name {get, set};
}
下面是支持域的实体模型:
class PersonEF
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get, set};
public string name {get, set};
}
现在,当我收到 POST 创建新 Person 的请求时,它不包含应该由数据库生成的 ID。我首先使用 AutoMapper 将 Person 映射到 PersonEF,AutoMapper 在 PersonEF 中将 Id 设置为 0,因此数据库中的 INSERT 失败。因此,要解决这些问题,我的选择是:
将 Id 命名为 Person 中的其他名称。如果我这样做,那么我将不得不为 GET 请求的 Id 编写自定义映射。
使 Id 在 Person 和 PersonEF 中都可以为空(int?),这样自动递增就可以了,但是将 key 作为 nullable int 本身听起来并不是一个好主意。
所以请建议最好的方法。
编辑
我的错。缺少代码 context.SaveOrUpdate()。我添加了它并且它按预期工作。
很难确定,因为您应该发布的最重要的代码是您的控制器操作中发生映射和保存的代码。但是,我可以告诉您 0
是 整数的默认值。这不是由于 AutoMapper 或一般的映射本身。新创建的实体,没有任何其他交互,仍然会有 0
作为 id。
因此,这应该不会导致保存实体出现问题,否则您将永远无法保存任何具有 int PK 的实体。但是,根据 Entity Framework 认为您尝试对实体执行的操作,它可能会导致问题。也就是说,您需要确保 Entity Framework 知道您想要 创建 这个实体,而不仅仅是更新它。通常,只需将其添加到 DbSet
:
db.PersonEFs.Add(personEF);
不确定为什么你需要比这更进一步,但如果由于某种原因这不起作用,你可以更明确一点:
db.Entry(personEF).State = EntityState.Added;
但是,实际上,如果您需要这样做,还有其他事情需要您进行掩饰。