我正在尝试在我当前的项目中遵循 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};
}
现在,当我收到创建新 Person 的 POST 请求时,它不包含 Id,因为它应该由数据库生成。我首先使用 AutoMapper 将 Person 映射到 PersonEF,它将 PersonEF 中的 Id 设置为 0,因此数据库中的 INSERT 失败。因此,要解决这些问题,我的选择是:
将 Id 命名为 Person 中的其他名称。如果我这样做,那么我将不得不为 GET 请求的 Id 编写自定义映射。
在 Person 和 PersonEF 中使 Id 可为 null(int?),这样自动增量就可以工作,但将 key 作为可为 null int 本身听起来并不是一个好主意。
所以请建议最好的方法来做到这一点。
编辑
我的错。代码缺少 context.SaveOrUpdate()。我添加了它并且它按预期工作。
最佳答案
很难肯定地说,因为您应该发布的最重要的代码是发生映射和保存的 Controller 操作的代码。不过,我可以告诉您,0
是 int 的默认值。这并不是由 AutoMapper 或一般映射本身造成的。刚创建的实体,没有任何其他交互,仍将 0
作为 ID。
因此,这应该不会导致保存实体时出现问题,否则您将永远无法保存任何具有 int PK 的实体。但是,根据 Entity Framework 认为您尝试对实体执行的操作,它可能会导致问题。也就是说,您需要确保 Entity Framework 知道您想要创建此实体而不仅仅是更新它。通常,只需将其添加到 DbSet
即可实现:
db.PersonEFs.Add(personEF);
不确定为什么您需要比这更进一步,但如果由于某种原因这不起作用,您可以更明确一点:
db.Entry(personEF).State = EntityState.Added;
但是,实际上,如果您需要这样做,那么您只需掩盖其他正在发生的事情。
关于asp.net-mvc - 如何将自动增量 ID 从域模型映射到 Entity Framework ASP.NET Web API 中的实体模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794901/