asp.net-mvc - 如何将自动增量 ID 从域模型映射到 Entity Framework ASP.NET Web API 中的实体模型

标签 asp.net-mvc entity-framework asp.net-web-api domain-driven-design

我正在尝试在我当前的项目中遵循 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 失败。因此,要解决这些问题,我的选择是:

  1. 将 Id 命名为 Person 中的其他名称。如果我这样做,那么我将不得不为 GET 请求的 Id 编写自定义映射。

  2. 在 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/

相关文章:

asp.net-core - IConfiguration 不从 appsettings.json 而是从 Azure Key Vault 检索值

c# - 将字符串转换为日期时间的 LINQ 查询

c# - 必须使用 dbcontext.Database.SqlQuery 声明标量变量 '@custid'?

asp.net-mvc - WebAPI HttpContext 缓存 - 有可能吗?

asp.net-mvc - ASP.NET Web Api 元数据交换?

entity-framework - 我可以在 Windows 8.1 商店应用程序中使用 Entity Framework 6 吗?

c# - 测试 WebApi Controller Url.Link

Javascript:是否有类似 sessionStorage 或 localStorage 之类的东西仅适用于一页?

javascript - 在 mvc 中加载 View 时调用 javascript 函数

javascript - MVC 如何从 html 触发其他服务器上的操作