Это одно из мест, с помощью которого привязка данных, используемая во многих новых фреймворках JavaScript, будет очень полезна для вас ...
Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена для вас, поэтому простым языком ваш результат undefined
на первом этапе, поэтому вы получили result = undefined
до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...
Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?
Вы можете использовать обратный вызов, обещание и недавно наблюдаемое, чтобы обрабатывать его для вас, например, в обещаниях мы имеем некоторые функции, такие как success () или then (), которые будут выполняться, когда ваши данные будут готовы для вас, с функцией обратного вызова или подписки на наблюдаемые.
Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:
$(document).ready(function(){
function foo() {
$.ajax({url: "api/data", success: function(data){
fooDone(data); //after we have data, we pass it to fooDone
}});
};
function fooDone(data) {
console.log(data); //fooDone has the data and console.log it
};
foo(); //call happens here
});
Для получения дополнительной информации n изучение обещаний и наблюдаемых, которые являются новыми способами для создания асинхронных материалов.
Пожалуйста, обратитесь к этой ссылке.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
Вы должны установить свойство StoreGeneratedPattern для идентификации, а затем попробовать свой собственный код.
Или вы также можете использовать это.
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
Я использовал ответ Ladislav Mrnka , чтобы успешно получить идентификаторы при использовании Entity Framework, но я размещаю здесь, потому что я пропустил его (то есть использовал его там, где это не было необходимо) и подумал, что я опубликую свои выводы здесь, в случае, когда люди ищут «решить» проблему, которую я имел.
Рассмотрим объект 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
Теперь, когда я сохраняю изменения, идентификатор, созданный для клиента, также добавляется по заказу. Мне не нужны дополнительные шаги
. Я знаю, что это не отвечает на исходный вопрос, но подумал, что это может помочь разработчикам, которые не знакомы с EF, из-за использования голосового ответа для чего-то это может не потребоваться.
Все ответы очень хорошо подходят для их собственных сценариев, что я сделал по-другому, так это то, что я назначил int PK непосредственно из объекта (TEntity), который 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
}
, поэтому вместо создания всего нового объекта вы просто берете то, что хотите:)
Когда вы сначала используете код EF 6.x
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
и инициализируете таблицу базы данных, он будет помещать
(newsequentialid())
в свойства таблицы под заголовком. По умолчанию Значение или Связывание, позволяющее заполнять идентификатор, когда он вставлен.
Проблема заключается в том, что вы создаете таблицу и добавляете часть
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
позже, будущие базы данных обновлений не будет добавлять обратно (newsequentialid ())
. Чтобы исправить правильный путь, нужно стереть миграцию, удалить базу данных и перенаправить ... или вы можете просто добавить (newsequentialid ()) в таблицу дизайнер.
Это довольно легко. Если вы используете идентификаторы сгенерированных БД (например, IDENTITY
в MS SQL), вам просто нужно добавить сущность к ObjectSet
и SaveChanges
по соответствующему ObjectContext
. Id
будет автоматически заполняться для вас:
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
Структура объекта по умолчанию следует за каждым INSERT
с SELECT SCOPE_IDENTITY()
, когда используются автоматически сгенерированные Id
s.
Вам необходимо перезагрузить объект после сохранения. Потому что он был изменен с помощью триггера базы данных, который не может быть отслежен EF. Итак, нам нужно перезагрузить объект снова из БД,
db.Entry(MyNewObject).GetDatabaseValues();
Затем
int id = myNewObject.Id;
Посмотрите на @jayantha ответ в следующем вопросе:
Вы также можете посмотреть в следующем вопросе @christian ответ в следующем вопросе:
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
Это будет работать.
Объект, который вы сохраняете, должен иметь правильный Id
после распространения изменений в базе данных.
Вы можете получить идентификатор только после сохранения, вместо этого вы можете создать новый Guid и назначить перед сохранением.
Существует две стратегии:
ID
(int
или GUID
) Минусы: вы должны выполнить SaveChanges()
, чтобы получить ID
для просто сохраненных объектов. Плюсы: Можно использовать идентификатор int
. ID
- только GUID. Плюсы: минимизация операций SaveChanges
. Возможность вставить большой график новых объектов за одну операцию. Минусы: разрешено только для GUID