【发布时间】:2018-02-11 02:47:19
【问题描述】:
在我的 ASP.NET MVC 5 应用程序中,我需要获取为数据库中的特定条目生成的主键。此外,我需要获取该 ID 并在数据库中设置外键关系。我尝试了以下尝试,它似乎正在工作,但我不得不致电_context.SaveChanges() TWICE。
UI 行为:用户有一个下拉列表,其中包含推荐形式的公司列表。当未找到公司时,用户将在下拉列表中选择“其他”。它将显示一个文本框,用户将在其中输入公司名称。所以我需要将此公司添加到数据库中并将其链接到推荐行。
表Referral和Company之间的关系:
dBModelBuilder.Entity<Company>()
.HasMany(u => u.Referrals)
.WithRequired(u => u.Company)
.HasForeignKey(u => u.CompanyId);
模型类:
public class Company
{
[Key]
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public ICollection<Referral> Referrals { get; set; }
public ICollection<CoverLetter> CoverLetters { get; set; }
}
public class Referral
{
[Key]
public int ReferralId { get; set; }
[Display(Name = "REFERRALS")]
public string ReferralName { get; set; }
public int? CoverLetterId { get; set; }
public virtual CoverLetter CoverLetter { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
视图模型:
public class Referral
{
[Key]
public int ReferralId { get; set; }
[Display(Name = "REFERRALS")]
public string ReferralName { get; set; }
public int? CoverLetterId { get; set; }
public virtual CoverLetter CoverLetter { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
我在控制器操作中的尝试:
[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
};
f.Referrals.Add(referral); // Referrals is NULL(EXCEPTION)
_context.Companies.Add(f);
// _context.SaveChanges();
//_context.Referrals.Add(referral);
// referral.CompanyId = f.CompanyId;
_context.SaveChanges();
}
【问题讨论】:
-
哪个表是父表,哪个表是子表?此外,在您的用例中,您有一个推荐屏幕,然后需要为该推荐分配一家公司,该公司在数据库中可能存在也可能不存在?
-
我在问题中添加了 Fluent Api 关系。已编辑。
-
@MrSlim:是的,当它不存在时,用户选择一个名为“Others”的所谓“公司”(它本身就是公司表中的一行)并将实际公司名称放在文本框中
-
@MrSlim:我现在添加了整个控制器动作。你能看一次吗?
标签: c# sql asp.net-mvc entity-framework asp.net-mvc-5