实体框架主键初始化

本文关键字:初始化 框架 实体 | 更新日期: 2023-09-27 18:25:26

I首先使用EF 6.0模型。我有一个带有主键的实体。当我使用新运算符创建实体时,主键总是设置为0。直到稍后的过程中,我才能执行上下文保存。在代码的其他部分,有必要引用主键。作为一种变通方法,我手动将主键设置为唯一值。有没有办法让系统自动生成主键?

提前感谢,Terry

实体框架主键初始化

在SaveChanges之前无法获取Id。因为主键是由数据库引擎设置的。您所能做的就是引用已实现的对象,而不是id。然后EF以正确的方式进行保存。你的模型可以看起来:

class Parent
{
    public int Id { get; set; }
    public List<Child> Children { get; set; }
}
class Child
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public Parent Parent { get; set; }
}

然后,您可以使用引用轻松保存,并且ID将在SaveChanges之后填充。

var parent = new Parent()
parent.Childs = new List<Child>()
var child1 = new Child();
var child2 = new Child();
parent.Childs.Add(child1);
parent.Childs.Add(child2);
dbContex.Parents.Add(parent);
dbContex.SaveChanges();

如果必须在客户端设置主键,您可能需要将DatabaseGeneratedOption.Identity删除为None,然后从int切换到guid,并手动将值设置为guid.NewGuid。我实际上并不喜欢这种方法,从性能的角度来看,您希望主键是最小的可行数据类型,但是,如果您需要在数据库之外生成主键,通常是这样做的。