【问题标题】:How to map auto increment Id from domain model to entity model in Entity Framework ASP.NET Web API如何在实体框架 ASP.NET Web API 中将域模型的自动增量 ID 映射到实体模型
【发布时间】:2015-10-26 00:13:23
【问题描述】:

我正在尝试为我当前的项目关注 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,AutoMapper 将 PersonEF 中的 Id 设置为 0,因此数据库中的 INSERT 失败。因此,要解决这些问题,我的选择是:

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

  2. 在 Person 和 PersonEF 中使 Id 可以为空(int?),这样自动递增将起作用,但是将键设置为可以为空的 int 本身听起来并不是一个好主意。

所以请建议最好的方法来做到这一点。

编辑

我的错。代码缺少 context.SaveOrUpdate()。我添加了它,它按预期工作。

【问题讨论】:

  • 您确定自动递增的 ID 是最好的方法吗?如果您需要一些指导来决定 ID 设计,请参阅this answer of mine。我不知道 EF 的具体细节,但 GUID ID 可能更容易处理。

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


【解决方案1】:

很难确定,作为最重要的代码,您应该发布的代码是发生映射和保存的控制器操作的代码。但是,我可以告诉你0 是int 的 默认值。这不是由于 AutoMapper 或一般的映射本身。新创建的实体,没有任何其他交互,仍然有 0 作为 id。

因此,这应该不会导致保存实体出现问题,否则您将永远无法保存任何具有 int PK 的实体。但是,根据 Entity Framework 认为您尝试对实体执行的操作,它可能会导致问题。也就是说,您需要确保 Entity Framework 知道您想要创建这个实体,而不仅仅是更新它。通常,只需将其添加到DbSet

db.PersonEFs.Add(personEF);

不知道为什么你需要走得更远,但如果由于某种原因这不起作用,你可以更明确一点:

db.Entry(personEF).State = EntityState.Added;

但是,真的,如果你需要这样做,还有其他事情发生,你只是在掩盖。

【讨论】:

  • 感谢您的评论,由于我们这里有一些政策,我无法发布实际代码,但它相当简单。我知道 int 的默认值为 0。你是说当我在 personEF 中将 Id 设置为 0 然后我调用 db.PersonEFs.Add(personEF);它应该忽略 0 并实际插入自动递增的数字?在其他更简单的项目中,我使用实体模型作为我的域模型(因此在任何地方都没有映射),我会设置其他属性但不触摸 Id,它只会在我调用 Add 方法时起作用。
  • 没错。 int pk 属性,因为它不可为空,所以必须有 some 值,所以默认情况下它总是0。在您根本没有触摸 id 属性的情况下,它仍然是0。由于其状态为“已添加”,EF 应忽略该值。现在,在您将更改提交到数据库之前,它实际上不会是零,不过,此时 EF 将用插入时 PK 的内容回填它。
  • 谢谢。我的代码中有一个愚蠢的错误。用理由更新了问题。
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 2011-08-28
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多