首页 文章

如何在Entity框架中获取插入实体的Id? [关闭]

提问于
浏览
469

我在Asp.net中遇到了Entity Framework的问题 . 每当我将对象添加到数据库时,我想获取Id值 . 我怎样才能做到这一点?

11 回答

  • 76
    Repository.addorupdate(entity, entity.id);
    Repository.savechanges();
    Var id = entity.id;
    

    这会奏效 .

  • 0

    当您首先使用EF 6.x代码时

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }
    

    并初始化一个数据库表,它会放一个

    (newsequentialid())
    

    在 Headers Default Value或Binding下的表属性内,允许在插入ID时填充ID .

    问题是如果您创建一个表并添加

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    

    部分之后,未来的更新数据库将不会添加(newsequentialid())

    要修复正确的方法是擦除迁移,删除数据库并重新迁移...或者您只需将(newsequentialid())添加到表设计器中 .

  • 13

    这很简单 . 如果您正在使用DB生成的ID(如MS SQL中的 IDENTITY ),则只需在 ObjectSet 上添加实体 ObjectSetSaveChanges . Id 将自动为您填写:

    using (var context = new MyContext())
    {
      context.MyEntities.AddObject(myNewObject);
      context.SaveChanges();
    
      int id = myNewObject.Id; // Yes it's here
    }
    

    当使用自动生成的 Id 时,默认情况下,实体框架在每个 INSERTSELECT SCOPE_IDENTITY() 之后 .

  • 19

    您只能在保存后获取ID,而是可以在保存之前创建新的Guid并进行分配 .

  • -1

    有两种策略:

    • 使用数据库生成的 IDintGUID

    缺点:

    您应该执行 SaveChanges() 以获取刚刚保存的实体的 ID .

    优点:

    可以使用 int 身份 .

    • 使用客户端生成的 ID - 仅限GUID .

    优点:缩小 SaveChanges 操作 . 能够在每个操作中插入新对象的大图 .

    缺点:

    仅允许 GUID

  • 5

    我在使用实体框架时一直使用Ladislav Mrnka's answer来成功检索ID但是我在这里发帖是因为我曾经错过了使用它(即在不需要它的地方使用它)并认为我会在这里发布我的调查结果以防万一正在寻找"solve"我遇到的问题 .

    考虑与Customer具有外键关系的Order对象 . 当我在同一时间添加新客户和新订单时,我正在做这样的事情;

    var customer = new Customer(); //no Id yet;
    var order = new Order(); //requires Customer.Id to link it to customer;
    context.Customers.Add(customer);
    context.SaveChanges();//this generates the Id for customer
    order.CustomerId = customer.Id;//finally I can set the Id
    

    但是在我的情况下,这不是必需的,因为我在customer.Id和order.CustomerId之间有一个外键关系

    我所要做的就是这个;

    var customer = new Customer(); //no Id yet;
    var order = new Order{Customer = customer}; 
    context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
    

    现在,当我保存更改时,为客户生成的ID也会添加到订单中 . 我不需要额外的步骤

    我知道这并没有回答原来的问题,但认为它可能会帮助EF新手的开发人员过度使用最高投票的答案来解决可能不需要的问题 .

  • 804

    在将更改传播到数据库之后,您要保存的对象应该具有正确的 Id .

  • 3

    我遇到一种情况,我需要在数据库中插入数据,同时需要使用实体框架的主要ID . 方案:

    long id;
    IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
    try
     {
        InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
        InfoBase.Add(generalinfo);
        InfoBase.Context.SaveChanges();
        id = entityclassobj.ID;
        return id;
     }
    
  • 10

    所有答案都非常适合他们自己的场景,我做的不同就是我直接从对象(TEntity)分配了int PK,Add()返回到这样的int变量;

    using (Entities entities = new Entities())
    {
          int employeeId = entities.Employee.Add(new Employee
                            {
                                EmployeeName = employeeComplexModel.EmployeeName,
                                EmployeeCreatedDate = DateTime.Now,
                                EmployeeUpdatedDate = DateTime.Now,
                                EmployeeStatus = true
                            }).EmployeeId;
    
          //...use id for other work
    }
    

    所以不要创建一个完整的新对象,而是只需要你想要的东西:)

    编辑@GertArnold先生:

    enter image description here

  • 0

    您需要在savechanges之后重新加载实体 . 因为它已被EF无法跟踪的数据库触发器更改 . 所以我们需要从DB重新加载实体,

    db.Entry(MyNewObject).GetDatabaseValues();
    

    然后

    int id = myNewObject.Id;
    

    请看以下问题中的@jayantha答案:

    How can I get Id of inserted entity in Entity framework when using defaultValue?

    在下面的问题中看@christian答案也可能有所帮助:

    Entity Framework Refresh context?

  • 3

    请参阅此链接 .

    http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/

    您必须将StoreGeneratedPattern的属性设置为identity,然后尝试自己的代码 .

    否则你也可以使用它 .

    using (var context = new MyContext())
    {
      context.MyEntities.AddObject(myNewObject);
      context.SaveChanges();
    
      int id = myNewObject.Id; // Your Identity column ID
    }
    

相关问题