1

Car私はインターフェースを持っているとしましょう。それぞれCarに のようなパーツがセットになっていICollection<Part>ます。エンティティには、クラス参照に加えPartて、ID とオプションの外部キー参照があります。CarIdPublic Car Car{ get; set;}

ここが興味深い部分です。でパーツを表示するフォームがあるとしますPart IDPartリポジトリにアクセスしてフォームを作成します。form.Part = repos.Retrieve(PartID). これで、フォームは部品 (および部品を介して部品が属する車両) への参照を持ちます。を使用してフォームを作成しますcontext.Forms.Add(form);

データベースは、既存のものを参照するのではなく、独自の個別の ID を使用して、重複する車両と部品を作成します。

誰かがなぜこれが起こるのか説明できますか?


編集

それらを望む人のためのクラスの例:

public class Form
{
    public int ID { get; set;}

    public Part Part { get; set;}      // Reference to Part
    public int? PartId { get; set; }   // Foreign Key to Part ID
}

public class Car : Vehicle
{
    public int ID { get; set;}

    public virtual ICollection<Part> Parts { get; set;} //Each car has parts
}

public class Part
{
    public int ID { get; set;}

    public Car Car { get; set;}      // Reference to Car
    public int? CarId { get; set; }   // Foreign Key to Car
}

この誤動作を引き起こすコード。Part と Car がデータベースに既に存在すると仮定します。

form Form = new form();
form.Part = partRepository.Retrieve(5); //gets part with id = 5
context.formRepository.Add(form); // new part created, duplicate of part #5 but with the next available id.
4

2 に答える 2

3

これらのリポジトリ内のどこかにDbContext、データベースとの通信に使用される がありますよね?

Parts問題は、 2 つの異なるリポジトリを介して同じエンティティ ( ) を処理していることです。フォームをフォーム リポジトリに追加すると、パーツが一緒に取り込まれる可能性があります。それらのパーツがデータベースに既に存在し、別のリポジトリ/DbContext から来たため、データベースからロードされたことをそのリポジトリが知る方法はありません。

これらのリポジトリが一緒に使用されたときに共通の DbContext を共有するか、2 つではなく 1 つのリポジトリを作成するように、システムを実際に再設計する必要があります。

(個人的には、人々が常にエンティティ フレームワークの上にリポジトリを作成する理由を理解できませんでした。DbContext、リポジトリ パターン自体の実装です)。

于 2012-07-31T20:40:00.573 に答える
0

ID をデータ注釈キー属性でマークしてみてください。これにより、重複を避けるために ID が主キーとしてマークされます

public class Form
{
    [Key]
    public int ID { get; set;}

    public Part Part { get; set;}      // Reference to Part
    public int? PartId { get; set; }   // Foreign Key to Part ID
}

public class Car : Vehicle
{
    [Key]
    public int ID { get; set;}

    public virtual ICollection<Part> Parts { get; set;} //Each car has parts
}

public class Part
{
    [Key]
    public int ID { get; set;}

    public Car Car { get; set;}      // Reference to Car
    public int? CarId { get; set; }   // Foreign Key to Car
}
于 2012-07-31T20:39:46.763 に答える