Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# 如何在实体框架中为新条目获取主键并设置FK关系_C#_Sql_Asp.net Mvc_Entity Framework_Asp.net Mvc 5 - Fatal编程技术网

C# 如何在实体框架中为新条目获取主键并设置FK关系

C# 如何在实体框架中为新条目获取主键并设置FK关系,c#,sql,asp.net-mvc,entity-framework,asp.net-mvc-5,C#,Sql,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,在我的ASP.NETMVC5应用程序中,我需要获取为数据库中的特定条目生成的主键。另外,我需要获取该id并在数据库中设置外键关系。我尝试了下面的尝试,它似乎正在工作,但我不得不调用_context.SaveChanges两次 用户界面行为:用户有一个下拉列表,其中列出了推荐表格中的公司。当找不到公司时,用户将在下拉列表中选择其他公司。它将显示一个文本框,用户将在其中输入公司名称。因此,我需要将该公司添加到数据库,并将其链接到推荐行 表引用和公司之间的关系: 我在控制器操作中的尝试: [H

在我的ASP.NETMVC5应用程序中,我需要获取为数据库中的特定条目生成的主键。另外,我需要获取该id并在数据库中设置外键关系。我尝试了下面的尝试,它似乎正在工作,但我不得不调用_context.SaveChanges两次

用户界面行为:用户有一个下拉列表,其中列出了推荐表格中的公司。当找不到公司时,用户将在下拉列表中选择其他公司。它将显示一个文本框,用户将在其中输入公司名称。因此,我需要将该公司添加到数据库,并将其链接到推荐行

表引用和公司之间的关系:

我在控制器操作中的尝试:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(ReferralViewModel viewModel)
    {
        var candidateId = User.Identity.GetUserId();

        var referral = new Referral
        {
            ReferralName = viewModel.ReferralName,
        };

        if (viewModel.CompanyId.HasValue)
        // if it is option 4 then we need to add it to the company table
        {
            if (!string.IsNullOrEmpty(viewModel.TempCompany))
            {
                var f = new Company
                {
                    CompanyName = viewModel.TempCompany
                };

                _context.Companies.Add(f);
               // ********FIRST CALL
                 _context.SaveChanges(); 

                _context.Referrals.Add(referral);
                 referral.CompanyId = f.CompanyId;
               // **********SECOND CALL
                _context.SaveChanges(); // SECOND CALL ------
            }
            else
            {
                referral.CompanyId = viewModel.CompanyId.Value;
                _context.Referrals.Add(referral);
                _context.SaveChanges();
            }
        }

        return RedirectToAction("ReferralCenter");
    }
问题:我可以在对_context.SaveChanges;的一次调用中完成这些步骤吗

编辑

使用此代码,我得到一个NullReferenceException:


如果已定义导航属性,则只需一次保存公司和转介,如下所示:

if (!string.IsNullOrEmpty(viewModel.TempCompany))
{
   var f = new Company
   {
        CompanyName = viewModel.TempCompany
   };
   referral.Company = f;
   _context.SaveChanges();
}
EF将负责设置FK

编辑

已更新代码,以包括注释中提到的_context.referels.addreference:

if (!string.IsNullOrEmpty(viewModel.TempCompany))
{
   var f = new Company
   {
        CompanyName = viewModel.TempCompany
   };

   referral.Company = f;
   _context.Referrals.Add(referral);
   _context.SaveChanges();
}

如果已定义导航属性,则只需一次保存公司和转介,如下所示:

if (!string.IsNullOrEmpty(viewModel.TempCompany))
{
   var f = new Company
   {
        CompanyName = viewModel.TempCompany
   };
   referral.Company = f;
   _context.SaveChanges();
}
EF将负责设置FK

编辑

已更新代码,以包括注释中提到的_context.referels.addreference:

if (!string.IsNullOrEmpty(viewModel.TempCompany))
{
   var f = new Company
   {
        CompanyName = viewModel.TempCompany
   };

   referral.Company = f;
   _context.Referrals.Add(referral);
   _context.SaveChanges();
}

我的理解是,FK约束在EF中管理,只要它们在DB中配置

如果在EF模型中,引用是公司的子级,那么应该有一个可从公司对象实例访问的引用集合

更新 我刚刚在CompanyId 4 x Companys上构建了一个简单的MVC Proj示例、2个SQL表引用和Company FK,第4个是其他公司,构建了一个EF模型,使用反向POCO以提高速度,添加了一个带有支架和视图的控制器,并将我的控制器修改为以下内容。我只是插入日期时间,而不是临时公司名称。这里生成的语法更像@ashin的答案,但对我来说很有用

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ReferralId,CompanyId")] Referral referral)
    {
        if (ModelState.IsValid)
        {
            if (referral.CompanyId == 4)
            {
                var f = new Company() { Name = DateTime.Now.ToString() };
                referral.Company = f;
            }
            db.Referrals.Add(referral);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "Name", referral.CompanyId);
        return View(referral);
    }
我的公司模型确实实例化了一个新的推荐集合

    public Company()
    {
        Referrals = new System.Collections.Generic.List<Referral>();
    } 

我的理解是,FK约束在EF中管理,只要它们在DB中配置

如果在EF模型中,引用是公司的子级,那么应该有一个可从公司对象实例访问的引用集合

更新 我刚刚在CompanyId 4 x Companys上构建了一个简单的MVC Proj示例、2个SQL表引用和Company FK,第4个是其他公司,构建了一个EF模型,使用反向POCO以提高速度,添加了一个带有支架和视图的控制器,并将我的控制器修改为以下内容。我只是插入日期时间,而不是临时公司名称。这里生成的语法更像@ashin的答案,但对我来说很有用

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ReferralId,CompanyId")] Referral referral)
    {
        if (ModelState.IsValid)
        {
            if (referral.CompanyId == 4)
            {
                var f = new Company() { Name = DateTime.Now.ToString() };
                referral.Company = f;
            }
            db.Referrals.Add(referral);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "Name", referral.CompanyId);
        return View(referral);
    }
我的公司模型确实实例化了一个新的推荐集合

    public Company()
    {
        Referrals = new System.Collections.Generic.List<Referral>();
    } 


请参见问题中的“我的问题”部分。F将FK设置为公司表其他行值的主键。我相信如果调用了_context.references.addreference,则此代码会起作用,因此+1我看到了问题的初始版本,它非常小。我假设引用对象已经由上下文加载。已编辑我的答案,以包含Slim提到的更改。谢谢请参见问题中的“我的问题”部分。F将FK设置为公司表其他行值的主键。我相信如果调用了_context.references.addreference,则此代码会起作用,因此+1我看到了问题的初始版本,它非常小。我假设引用对象已经由上下文加载。已编辑我的答案,以包含Slim提到的更改。谢谢请参阅问题中的“我的问题”部分“我的代码出现空引用异常”。请看我的编辑。我需要在公司的构造函数或类似的东西中初始化引用集合吗?我在公司的构造函数中没有任何东西,我刚刚添加了构造函数,现在它可以工作了。那么,这是否意味着当我设置多个关系时,我应该始终在构造函数中初始化集合作为经验法则?它必须在某个地方初始化,我认为构造函数似乎是一个合适的位置。虽然理解EF配置是如何工作的很重要,但为了获得启动和运行的绝对速度,多年来我一直在使用Simon Hughes Reverse Poco Generator,使用它可以提供生成EF样板代码的统一方式。请参阅问题中的“我的问题”部分“我的代码出现空引用异常”。请看我的编辑。我需要在公司的构造函数或类似的东西中初始化引用集合吗?我在公司的构造函数中没有任何东西,我刚刚添加了构造函数,现在它可以工作了。多伊
这意味着,每当我设置多个关系时,我都应该按照拇指规则在构造函数中初始化集合。它必须在某个地方初始化,我认为构造函数似乎是一个合适的地方。虽然理解EF配置是如何工作的很重要,但为了获得启动和运行的绝对速度,多年来我一直在使用Simon Hughes Reverse Poco Generator,使用它可以提供生成EF样板代码的统一方式。哪个表是父表,哪个表是子表?另外,在您的用例中,您有一个推荐屏幕,然后需要为该推荐分配一个公司,该公司可能存在于DB中,也可能不存在于DB中?我在问题中添加了Fluent Api关系。编辑了它。@MrSlim:是的,当它不存在时,用户选择一个称为“其他公司”的所谓公司,它本身就是公司表中的一行,并将实际的公司名称放入textbox@MrSlim:我现在添加了整个控制器操作。你能看一下吗?哪张桌子是家长,哪张桌子是孩子?另外,在您的用例中,您有一个推荐屏幕,然后需要为该推荐分配一个公司,该公司可能存在于DB中,也可能不存在于DB中?我在问题中添加了Fluent Api关系。编辑了它。@MrSlim:是的,当它不存在时,用户选择一个称为“其他公司”的所谓公司,它本身就是公司表中的一行,并将实际的公司名称放入textbox@MrSlim:我现在添加了整个控制器操作。你能看一下吗。