Как я могу получить идентификатор вставленного объекта в инфраструктуре Entity при использовании defaultValue?

Есть ли способ отправить свойство с 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.

Ответ 1

Вам необходимо перезагрузить объект после сохранения. Поскольку он был изменен с помощью триггера базы данных, который не может быть отслежен EF. Итак, нам нужно перезагрузить объект снова из БД,

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

return x.ID;

Ответ 2

У меня была та же проблема, что мой ключ не будет обновляться после вызова SaveChanges, и он вернет null для context.Entry(newObj).GetDatabaseValues().

В моем случае установка StoreGeneratedPattern в Identity (на ключ) в модели EntityFramework заставила ключ обновляться после вызова SaveChanges.

Ответ 3

используя (var context = new EntityContext()) {

var customer = new Customer()
{
    Name = "John"
};

context.Customers.Add(customer);

context.SaveChanges();      

int id = customer.CustomerID;

}

Ответ 4

   using (var context = new MyContext())
   {
       context.MyEntities.AddObject(newObject);
       context.SaveChanges();

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