我正在与两个有一对多关系的公司和访客班级合作。
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。我觉得我错过了一些关键点,我希望有人能指出我正确的方向。
答案 0 :(得分:0)
您不需要设置visitor.Company
。您可以Company
获取CompanyID
个信息,然后使用Where
和FirstOrDefault
来避免多余的信息:
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。