Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Linq/Entity框架中获取尚未创建的ID_C#_.net_Oracle_Entity Framework - Fatal编程技术网

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

C# 如何在Linq/Entity框架中获取尚未创建的ID,c#,.net,oracle,entity-framework,C#,.net,Oracle,Entity Framework,我有两张这样的桌子: **Complaint** -Id -CreatedBy -CreatedDate .... **Solution** -Id -ComplaintId 有时,投诉有一个即时解决方案,这意味着,当投诉被创建时,也会创建一个解决方案。数据库是Oracle,为了向数据库中插入新记录,我将StoredGeneratePattern设置为Identity,并使用触发器插入序列的值 here my code: using (var context = new Entit

我有两张这样的桌子:

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

        }
问题是,我无法获取新创建投诉的id来设置解决方案中的字段。我该怎么做


谢谢。

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

如果您在创建解决方案之前添加投诉和SaveChanges(),投诉对象将具有标识值,创建解决方案后,将其添加到上下文中,并再次调用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;
        }

另外,如果要在解决方案和投诉之间添加外键关系,则不会设置投诉ID,只需设置解决方案。投诉=投诉,并且在保存过程中会正确设置ID。

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

答案其实很简单。在这种情况下,我认为您根本不需要ID(至少不只是为了添加此关系),但如果您需要,请执行以下操作:

确保您在插入时有要刷新的投诉实体的ID(我们使用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,因为这需要单独的transactionscope。这样您就不需要投诉了。

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

因此,请像现在这样创建解决方案对象,然后执行以下操作:

Soltion.Complaint = newCreatedComplaintObject;

我尝试过,但即使在调用SaveChanges()之后,投诉实体的Id字段仍然为0:(根据Wes回复的第二部分,如果你已经正确设置了数据库关系,那么你不需要考虑它。当你创建新的解决方案时,只需将投诉设置为新的投诉。这是一篇关于这个问题的帖子,上面的内容对我来说很有用,但是这个帖子中的人必须设置结果栏绑定。我使用的是Oracle,这可能解释了为什么我无法获取complaintID,就像SQL Server一样。是否有任何方法可以将解决方案表中的外键添加到该字段的投诉Id中?如果您这样做,将添加导航属性,仅显示Solution.complaint=complaint并立即保存这两个对象。如果您不使用此选项实体框架的功能我认为您错过了它所能提供的最大好处之一。我使用的是Oracle,这可能解释了为什么我无法获取投诉ID,就像SQL Server一样。我实际上使用的是触发器,您能否提供有关“获取”的更多详细信息?谢谢:)现在我有了更多的时间来考虑它,因为您使用的是序列/触发器,我认为您应该做的是在创建/持久化对象之后,只需调用oracle以获取序列的当前值,并使用触发器的值填充对象的ID值。LINQ/EF对于oracle.NHiberna来说并不太好te与Oracle的配合非常好。如果您确实需要使用EF,请查看我已经在使用Oracle provider for EF,您能提供回拨到Oracle的实际代码吗?谢谢:)无法提供代码,因为我没有Oracle安装可供测试。我建议您在oracle中创建一个存储过程,以返回该表序列的当前值,然后将EF中的函数映射到该过程。然后您可以调用该函数并获取值。