2017-09-10 1 views
0

私は1対多の関係を持つ2つのクラスのCompanyとVisitorを扱っています。MVC EF:IDで複数のコンポーネントを追加する

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がdbの名前と一致する場合、会社はVisitorに関連付けられ、必要な情報が四捨五入され、それが独自のdbに追加されます。

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を既存の会社に関連させ、その後同じことを会社に行っています。私が読んだことは、Visitor's CompanyIDの更新は十分であるはずですが、existingCompanyをVisitor's Companyパラメータにマップしないと、2番目のCompanyIDが作成されます。私はいくつかの重要な点を見逃しているように感じ、ここの誰かが私に正しい方向を向けることを望んでいる。

答えて

0

visitor.Companyを設定する必要はありません。あなたはCompanyIDCompany情報を得ることができますし、このような冗長を避けるためにWhereFirstOrDefaultを使用することができます。public virtual Company Company { get; set; }プロパティが遅延読み込みをサポートできるように、Entity Frameworkのは、仮想財産の周りのプロキシを作成することを可能にすることを

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

お知らせより効率的な変更トラッキングが可能です。 EFのvirtualプロパティの詳細については、this postを参照してください。

+0

返信ありがとうございました。私はあなたが示唆したことを試しましたが、Visitor.CompanyIDと一致しないVisitor.Company.CompanyIDの新しいIDが作成されています。 2つをリンクする簡単な方法はありますか?私はそれが怠惰な読み込みだと思ったので、私はそれを有効にし、変更はありませんでした。 –

+0

@Yusif_Nurizadeコードのブロックに 'visitor'と' Company'を追加していますか? –

+0

アリ・ソルタニは、あなたが何を意味するかを明確にしていただけますか?どのようなコードブロックですか?私は上に既存のコードを持っています。会社が存在する場合、私はそれを追加せず、あなたの提案に応じてIDを関連付けるだけですが、IDが異なる新しい会社を作成します。 –

関連する問題