MVC EF:按ID添加一个到多个组件

时间:2017-09-10 04:55:19

标签: entity-framework foreign-keys parent-child

我正在与两个有一对多关系的公司和访客班级合作。

public class Company
{
    public int CompanyID { get; set; }
    public string CompanyName { get; set; }

    public virtual ICollection<Visitor> Visitors { get; set; }
}

public class Visitor
{
    public int VisitorID { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int CompanyID { get; set; }
    public bool SendNewsletter { get; set; }

    public virtual Company Company { get; set; }
}

我有一个访问者可以填写自己信息的页面。我们的想法是,如果公司不在数据库中,它将被添加到列表中。如果访问者输入的CompanyName与数据库中的名称匹配,则公司与访问者关联,将其所需信息四舍五入,然后将其添加到其自己的数据库中。

 var companyExists = db.Companies.Any(c => c.CompanyName == visitor.Company.CompanyName);
 if(companyExists)
 {
      var existingCompany = db.Companies.SingleOrDefault(c => c.CompanyName == visitor.Company.CompanyName);
      visitor.CompanyID = existingCompany.CompanyID;
      visitor.Company = existingCompany;
 }

 db.Visitors.Add(visitor);
 db.SaveChanges();

此代码有效但似乎多余。我将访客的CompanyID与现有公司联系起来,然后为公司做同样的事情。我读到的所有内容都表明更新访问者的CompanyID应该足够了但如果我没有将现有公司映射到访问者的公司参数,则会创建第二个CompanyID。我觉得我错过了一些关键点,我希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

您不需要设置visitor.Company。您可以Company获取CompanyID个信息,然后使用WhereFirstOrDefault来避免多余的信息:

var companyExists = db.Companies.Where(c => c.CompanyName == visitor.Company.CompanyName).FirstOrDefault();
if (companyExists)
{
   visitor.CompanyID = companyExists.CompanyID;
   // visitor.Company = companyExists;
}

请注意,public virtual Company Company { get; set; }允许实体框架围绕虚拟属性创建代理,以便该属性可以支持延迟加载和更有效的更改跟踪。有关EF中virtual属性的详细信息,请参阅this post