0

私は初心者なので、これから提示するコードでは、「適切なコード」に関して多くの違反があると思います。(コメントいただけると嬉しいです..)

私は3つのエンティティを持っています:

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; }

}

新しい「Age」エンティティを作成し、そのプロパティに値を設定してから、「Icollection」にいくつかの「AgeRange」エンティティを挿入し、DB から引き出しました。(それらはすでに存在します)新しい「Age」をdbContexに追加し、「savechanges」を実行すると例外が発生します:

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

(AgeRange PK は意図的に文字列になっています。これは、論理的に一定に保つことを意図しているためです)

残りのコードは次のとおりです。

[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;
    }

どんな助けでも大歓迎です。

4

2 に答える 2

1

Autofac でリポジトリを使用してサービスやリポジトリのインスタンスを自動的に作成する場合は、次のようにコンテキストを登録する必要があります。

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

これにより、コンテキストが単一インスタンスとして登録されます。したがって、これにより、すべてのサービスまたはリポジトリで常に同じコンテキストを使用して Bean を実行できます。

于 2014-03-22T22:36:54.600 に答える
0

2 つの異なるコンテキストを使用しているため、このエラーが発生しています。1 つAgeRangeはデータベースからエンティティを読み取ります。これは、コンストラクターで作成するクラスのModelContext dbプライベート メンバーです。Services

db = new ModelContext();

そして、コントローラ アクションで使用しているコレクションとAge一緒にエンティティを追加するための 2 番目のコンテキスト:AgeRange

db.Ages.Add(age);

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

Servicesクラスに 2 つの追加メソッドを作成できます。

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

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

そしてあなたのコントローラーで:

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

これで、操作全体が同じコンテキストを使用し、コードが機能するはずです。

于 2012-03-22T19:33:42.463 に答える