如何在Linq / Entity框架中获取尚未创建的ID

时间:2011-03-23 09:39:24

标签: c# .net oracle entity-framework

我有两张这样的表:

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

**Solution**
-Id
-ComplaintId

有时,投诉有一个即时解决方案,这意味着,在创建时,还会创建一个解决方案。数据库是Oracle,为了将新记录插入数据库,我将StoredGeneratePattern设置为Identity并使用trigger来插入序列的值。

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;
            }

        }

问题是,我无法获得新创建的投诉的ID来设置解决方案中的字段。我怎么能这样做?

谢谢。

5 个答案:

答案 0 :(得分:1)

你能不能执行第一次操作调用SaveChanges(),然后查询您的投诉对象,现在应该有一个complaintID。

答案 1 :(得分:1)

假设您正在使用Oracle的触发器/序列,则需要在保存更改后进行获取以获取填充了Id的对象。如果您没有使用触发器,则可以通过从序列中获取下一个值来手动设置新对象的Id。

答案 2 :(得分:0)

如果在创建解决方案之前添加投诉和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 = complaint并在保存期间正确设置ID。

答案 3 :(得分:0)

答案实际上很简单。在这种情况下,我根本不相信您需要ID(至少不仅仅是添加此关系),但如果您这样做,请执行以下操作:

确保您在Complaint实体上有ID以在Insert上刷新(我们使用DevArt,但我忘记了确切的设置名称,但如果您在实体上选择ID,您应该看到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,因为这需要单独的transactioncope。这样你就不需要了。

答案 4 :(得分:0)

您可以将投诉添加到解决方案“投诉”导航属性。

因此,像您一样创建解决方案对象,然后执行以下操作:

Soltion.Complaint = newCreatedComplaintObject;