Как получить еще не созданный ID в среде Linq / Entity - PullRequest
3 голосов
/ 23 марта 2011

У меня есть две таблицы, как это:

**Complaint**
-Id
-CreatedBy
-CreatedDate
....

**Solution**
-Id
-ComplaintId

Иногда жалоба имеет мгновенное решение, что означает, что при ее создании также создается решение. База данных - это Oracle, и для вставки новой записи в базу данных я установил StoredGeneratePattern в Identity и использую триггер для вставки значения последовательности.

here my code:    

using (var context = new Entities())
        {
        var complaint = new Complaint
                            {
                                Title = TitleTextBox.Text.Trim(),
                                CreatedBy = CurrentUser.UserID,
                                Description = DescriptionTextBox.Text.Trim(),
                                ServiceId = Convert.ToDecimal(ddlService2.Value),
                                Contact = ContactTextBox.Text.Trim(),
                                CreatedDate = DateTime.Now,
                                Customer = txtUserName.Text.Trim(),
                                ResellerId = CurrentUser.ResellerID,
                                Status = ComplaintStatus.GetStatusCode("New complaint")
                            };
        if (CompletedCheckBox.Checked)
        {
            complaint.Status = ComplaintStatus.GetStatusCode("Completed");
            var solution = new Solution
                               {
                                   CreatedBy = CurrentUser.UserID,
                                   CreatedDate = DateTime.Now,
                                   SolutionDesc = DescriptionTextBox.Text,
                                   ComplaintId = complaint.Id
                               };            
            context.Solutions.AddObject(solution);

        }

            context.Complaints.AddObject(complaint);
            if(context.SaveChanges() > 0)
            {
                ResetFrom();
                return true;
            }

        }

проблема в том, что я не могу получить идентификатор недавно созданной жалобы, чтобы задать поле в решении. Как я могу это сделать?

Спасибо.

Ответы [ 5 ]

1 голос
/ 29 марта 2011

Если вы используете триггер / последовательность в Oracle, вам нужно будет выполнить get после сохранения изменений, чтобы получить объект с заполненным Id. Если вы не используете триггер, вы можете установить Id вручную для нового объекта, получив следующее значение из последовательности.

1 голос
/ 23 марта 2011

Не могли бы вы выполнить первый вызов операции SaveChanges() и затем запросить объект жалобы, который теперь должен иметь идентификатор жалобы.

0 голосов
/ 03 апреля 2011

Вы можете добавить Жалобу в свойство навигации Жалоба Решения.

Итак, создайте объект решения, как вы делаете, и выполните следующие действия:

Soltion.Complaint = newCreatedComplaintObject;
0 голосов
/ 02 апреля 2011

Ответ на самом деле прост.В этом случае я не верю, что вам вообще нужен идентификатор (по крайней мере, не только для добавления этого отношения), но в этом случае сделайте следующее:

Убедитесь, что у вас есть идентификатор в сущности Жалоба, чтобыобновить при вставке (мы используем DevArt, но я забыл точное имя настройки здесь, но если вы выберете идентификатор для сущности, вы должны увидеть UpdateMode или что-то в этом роде, которое, как мне кажется, должно быть установлено в UpdateOnInsert), тогда

Чтобы просто вставить это отношение, сделайте следующее:

using (var context = new MyContext())
{
  var complaint = new Complaint {...};
  context.Complaints.AddObject(complaint);
  var solution = new Solution {..., Complaint = complaint};
  context.Solutions.AddObject(solution);
  context.SaveChanges();
}

Вы не захотите делать SaveChanges дважды, так как для этого требуется отдельная область транзакций.Таким образом, вам это не нужно.

0 голосов
/ 23 марта 2011

Если вы добавите жалобу и SaveChanges () перед созданием решения, объект жалобы будет иметь значение Identity, а после создания решения добавьте его в контекст и вызовите SaveChanges () во второй раз.

context.Complaints.AddObject(complaint);


if (CompletedCheckBox.Checked)
    {

        complaint.Status = ComplaintStatus.GetStatusCode("Completed");
        context.SaveChanges();

        var solution = new Solution
                           {
                               CreatedBy = CurrentUser.UserID,
                               CreatedDate = DateTime.Now,
                               SolutionDesc = DescriptionTextBox.Text,
                               ComplaintId = complaint.Id
                           };            
        context.Solutions.AddObject(solution);

    }


        if(context.SaveChanges() > 0)
        {
            ResetFrom();
            return true;
        }

Также, если бы вы добавили отношение внешнего ключа между решением и жалобой, вы бы не установили ComplaintId, вы просто задали бы solution.Complaint = жалобу, и идентификаторы были бы установлены правильно во время сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...