EntityFramework Core自动生成主键ID属性

6
使用 .Net Core MVC。我需要设置模型,以便 EntityFrameworkCore 可以自动生成 ID 属性。我认为只需添加 [Key] 注释即可实现此操作,但事实并非如此。实际上,当 ID 字段为空时(这总是因为我将其隐藏),它会产生错误。
相反,我需要每次自动生成唯一的模型 ID。我该如何做?我的 ID 属性当前是 int 类型。
示例模型: ExampleModel
public class ExampleModel
{
    [Key]
    public int ID { get; set; }
    public string SomeData { get; set; }
}

ExampleView

@model MyNamespace.Models.ExampleModel

<form asp-action="Create" asp-controller="ExampleModel">
    @Html.EditorForModel()
    <input type="submit" name="Submit" value="Create"/>
</form>

示例控制器

public IActionResult Create ()
{
    return View();
}
public IActionResult Create (ExampleModel model)
{
    if (ModelState.IsValid)
    {
        _context.ExampleModels.Add(model);
        _context.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(model);
}

你不需要 [Key] 属性,它默认为主键。 - Alexan
但是为什么它不会自动生成呢? - Joe Higley
你创建新项目时是否遇到了错误?请展示你的代码,说明你是如何操作的。 - Alexan
@Alex 我已经尝试使用你建议的属性,但仍然出现相同的错误。问题在于当ID为空时,ModelState.IsValid返回false。 - Joe Higley
当然,你应该将模型传递给具有ID的操作。 - Alexan
显示剩余6条评论
4个回答

14

您需要更改ExampleModel的数据注释,以便它自动生成唯一的ID。

ExampleModel

public class ExampleModel
{
    [ScaffoldColumn(false)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string SomeData { get; set; }
}

哈哈,你发布这条消息之前我就已经弄明白了。但是我会把你的答案标记为正确答案。谢谢。 - Joe Higley
你不需要使用DatabaseGenerated属性。Entity Framework会根据约定为int类型的主键设置自增标识。 - Smit
@Smit - DatabaseGenerated属性的原因是ExampleView使用@Html.EditorForModel()生成表单元素,用于ExampleModel。如果您复制上面的代码并省略DatabaseGenerated属性,则会在表单中为ID属性获取文本输入,并保存表单时不会自动生成ID值,这正是OP想要做的。 - kimbaudi
谢谢你的回答。使用[Key]与[DatabaseGenerated(DatabaseGeneratedOption.Identity)]结合使用可以达到我期望的结果。 - petah

1
我猜另一种跳过ModelState验证的方法是从ModelState中删除它。
ModelState.Remove("ID");

0
要自动生成一个键,您必须定义一个指向 "NewId()" 的 DEFAULT 约束。 [Key] 只会创建一个主键约束。
您可以在数据库本身或模型生成中执行此操作。

1
EF Core 中不需要它。 - Alexan
@Alexan 你好,在EF Core中,我将数据插入数据库后,为什么在SaveChanges()之后无法获取新生成的ID并回填到模型中?请问有任何帮助吗? - Neo
1
@Neo 如果你使用GUID作为ID,只需在代码中使用Guid.CreateNew(),不要使用约束或默认值... 代码生成的GUID保证与数据库生成的GUID一样唯一。 - Leonardo
我正在使用mysql,并使用自动生成的主键,它已经成功生成并添加到数据库表中,但在SaveChanges()之后,当我查看Id时,它是0。int Id = myaddedObject.Id; - Neo

0

我解决了。我所需要做的就是添加数据注释[ScaffoldColumn(false)],现在它可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接