我有两张这样的表:
**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来设置解决方案中的字段。我怎么能这样做?
谢谢。
答案 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;