12

有没有办法用 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.
4

6 回答 6

18

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

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

return x.ID;
于 2012-09-05T11:21:32.180 回答
3

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

 public int CreateMyEntity(MyEntityType myEntity)
 {
      Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<MyEntityType> created = _context.MyEntityType.Add(myEntity);
      _context.SaveChanges()
      return created.Entity.Id;
  }
于 2020-03-17T07:54:09.963 回答
2

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

就我而言,在 EntityFramework 模型中设置StoreGeneratedPatternIdentity(在键上)会导致键在调用SaveChanges.

于 2018-04-02T12:54:57.263 回答
1

我正在使用数据传输对象 (DTO) 从前端隐藏数据层的详细信息 - 然后将值从它分配给 db 对象。My CustomerId 是调用 SaveChanges() 后自动刷新的身份。不需要其他方法调用。并且由于“客户”是一个 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;
}
于 2020-02-11T20:12:06.967 回答
1
using (var context = new EntityContext())
{
    var customer = new Customer()
    {
        Name = "John"
    };

    context.Customers.Add(customer);

    context.SaveChanges();      

    int id = customer.CustomerID;
}
于 2019-06-11T08:25:13.803 回答
-3
   using (var context = new MyContext())
   {
       context.MyEntities.AddObject(newObject);
       context.SaveChanges();

       int id  = newObject.Id; // Will give u the autoincremented ID
   }
于 2012-09-05T11:17:05.287 回答