【问题标题】:How can I get Id of inserted entity in Entity framework when using defaultValue?使用 defaultValue 时,如何在实体框架中获取插入实体的 ID?
【发布时间】:2012-08-30 02:15:38
【问题描述】:

有没有办法用 defaultValue 发送一个属性,但用数据库计算结果更新它?数据库中有一个触发器,输入 -1 会触发一个计算新值的过程。如何找回价值?

<Property Name="ID" Type="int" Nullable="false" StoreGeneratedPattern="None" DefaultValue="-1" />

var x = new Stuff();
db.Stuff.AddObject(x);
db.SaveChanges();
return x.ID //gives -1, but the computed value should be different.

【问题讨论】:

  • 我试过 db.Refresh(System.Data.Objects.RefreshMode.StoreWins, x);但是没有运气,刷新方法可能使用ID搜索数据库,这是我需要刷新的值。

标签: c# entity-framework entity


【解决方案1】:
   using (var context = new MyContext())
   {
       context.MyEntities.AddObject(newObject);
       context.SaveChanges();

       int id  = newObject.Id; // Will give u the autoincremented ID
   }

【讨论】:

    【解决方案2】:

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

    var x = new Stuff();
    db.Stuff.AddObject(x);
    db.SaveChanges();
    db.Entry(x).GetDatabaseValues();
    
    return x.ID;
    

    【讨论】:

    • 我只想要 Identity Key 值和 GetDatabaseValues 加载表的所有字段。有没有其他方法也只加载身份密钥
    【解决方案3】:

    我遇到了同样的问题,我的密钥在调用 SaveChanges 后不会更新,它只会为 context.Entry(newObj).GetDatabaseValues() 返回 null。

    在我的例子中,在 EntityFramework 模型中将StoreGeneratedPattern 设置为Identity(在密钥上)会导致密钥在调用SaveChanges 后更新。

    【讨论】:

      【解决方案4】:
      using (var context = new EntityContext())
      {
          var customer = new Customer()
          {
              Name = "John"
          };
      
          context.Customers.Add(customer);
      
          context.SaveChanges();      
      
          int id = customer.CustomerID;
      }
      

      【讨论】:

        【解决方案5】:

        我正在使用数据传输对象 (DTO) 从前端隐藏数据层的详细信息 - 然后将值从它分配给 db 对象。 My CustomerId 是调用 SaveChanges() 后自动刷新的身份。不需要其他方法调用。而且由于“customer”是一个ref对象,所以会传播到前端。

        public static void Add(DTO.Customer customer)
        {
            MyEntities db = new MyEntities();
        
            var customerToAdd = new MyEntities.Data.Customer { Address = customer.Address, FirstName = customer.FirstName, LastName = customer.LastName, etc... };
            db.Customers.Add(customerToAdd);
        
            db.SaveChanges();
            customer.CustomerId = customerToAdd.CustomerId;
        }
        

        【讨论】:

          【解决方案6】:

          如果你使用的是 EF 核心,它可能是这样的:

           public int CreateMyEntity(MyEntityType myEntity)
           {
                Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<MyEntityType> created = _context.MyEntityType.Add(myEntity);
                _context.SaveChanges()
                return created.Entity.Id;
            }
          

          【讨论】:

            猜你喜欢
            • 2018-12-12
            • 2013-06-02
            • 2011-07-09
            • 1970-01-01
            • 2013-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多