Как я могу получить идентификатор вставленной сущности в Entity Framework при использовании 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.

3 ответа

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

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

return x.ID;

Если вы используете ядро ​​EF, это может быть так:

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

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

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

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

    context.Customers.Add(customer);

    context.SaveChanges();      

    int id = customer.CustomerID;
}

Я использую объект передачи данных (DTO), чтобы скрыть детали уровня данных от внешнего интерфейса, а затем присваиваю значения из него объекту db. My CustomerId - это идентификатор, который автоматически обновляется после вызова SaveChanges(). Никаких других вызовов методов не требуется. А поскольку "клиент" - это объект ссылки, он распространяется на интерфейсную часть.

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;
}
   using (var context = new MyContext())
   {
       context.MyEntities.AddObject(newObject);
       context.SaveChanges();

       int id  = newObject.Id; // Will give u the autoincremented ID
   }
Другие вопросы по тегам