0

私は初心者ですから、コードを推測すると、 「適切なコード」の点で違反が多い。 (どんな発言を得るために喜んで...)既にデータベースに存在するエンティティを親エンティティのIcollectionに挿入して変更を保存する方法

私は3 entitesがあります、私は新しい「年齢」エンティティを作成し

public class Person 
{ 
    public int PersonId { get; set; } 
    public int AgeId { get; set; } 
    ...//some properties 
} 

public class Age 
{ 
    public int AgeId { get; set;} 
    public int PersonsId { get; set; } 

    ...//some properties 

    public virtual ICollection<AgeRange> AgeRanges {get; set;} 

} 


public class AgeRange 
{ 
    public string AgeRangeId { get; set; } 
    public string Value { get; set; } 

    ICollection<Age> Ages { get; set; } 

} 

を、それが値を持つproperiesだし、それから、その「ICollectionを」に一部を挿入'AgeRange'エンティティ。これはDBから取り除きます。私の意図が一定にそれらを保つためにあるよう

Violation of PRIMARY KEY constraint 'PK_AgeRanges'. Cannot insert duplicate key in object 'dbo.AgeRanges'. 
The statement has been terminated. 

(AgeRange PKは、意図的に文字列である:私はdbContexに新しい「年齢」を追加し、ときに私は例外を取得「のSaveChanges」実行 を(彼らはすでに存在して)すべてのヘルプは理解されるであろう

[HttpPost] 
public ActionResult AddPerson(AddPersonViewModel vm) 
{ 

     if (ModelState.IsValid) 
     { 
      Services services = new Services(); 
      Age age = services.GetAgeEntity(vm.Ages); 
      db.Ages.Add(age); 
      db.SaveChanges(); //exception apears here. 
      ........ 

     } 

public class Services 
{ 
    ModelContext db; 

    public Services() 
    { 
     db = new ModelContext(); 
    } 

    public Age GetAgeEntity(string[] ages) 
    { 
     Age age = new Age(); 

     //some more code... 

     age.AgeRanges = GetAgeRanges(ages); 
     return age; 
    } 

     } 



    ICollection<AgeRange> GetAgeRanges(string[] ages) 
    { 
     Age age = new Age(); 
     age.AgeRanges = new List<AgeRange>(); 

     foreach (string item in ages) 
     { 
      var ageRange = db.AgeRanges.Find(item); 
      age.AgeRanges.Add(ageRange); 
     } 

     return age.AgeRanges; 
    } 

:ロジックベース)

は、ここでは、コードの残りの部分です。あなたは二つの異なるコンテキストを使用しているため

答えて

0

あなたはこのエラーを持っている:一つは、データベースからAgeRange実体を読む:

db = new ModelContext(); 

:それはあなたがコンストラクタで作成し、あなたのServicesクラスのModelContext dbプライベートメンバーですあなたは、コントローラのアクションで使用しているAgeRangeコレクションと一緒にAgeエンティティを追加すると、第2のコンテキスト:

db.Ages.Add(age); 

この同じdbインスタンスにすることはできません。第2のコンテキストは、別のコンテキストでロードされているため、AgeRangeエンティティについては何も知らない。したがって、SaveChangesは、それらを新しいエンティティとして挿入しようとします。

public void AddAgeEntity(Age age) 
{ 
    db.Ages.Add(age); 
} 

public void SaveChanges() 
{ 
    db.SaveChanges(); 
} 

そして、あなたのコントローラで:あなたはあなたのServicesクラスに2つの追加メソッド作成することができ

Services services = new Services(); 
Age age = services.GetAgeEntity(vm.Ages); 
services.AddAgeEntity(age); 
services.SaveChanges(); 

は今、全体の動作は同じコンテキストを使用し、あなたのコードは動作するはずです。

+0

本当にありがとうございました! –

1

あなたは自動的にあなたのサービスおよび/またはリポジトリのインスタンスを作成するためにAutofacでリポジトリを使用している場合は、あなたがこの

builder.RegisterInstance<IMyContext>(new MyContext("MyContext"));

これは、単一のisntanceとしてコンテキストを登録するようなコンテキストを登録する必要があります。このため、すべてのサービスまたはリポジトリ内で同じコンテキストを使用しています。

関連する問題