2

それはかなり自明です。私は別のクラスを持っていますそれらをサブジェクトとクラスルームと呼びましょう

public class Subject
{
   public Classroom Class {get; set;}
}

私はステートレスファサードを使用しています。これは、オブジェクトを回復した直後にDbContextが破棄され、新しいオブジェクトを格納するために作成されることを意味します。ClassroomのIDはすでにDBにあるので、Classroomが新しいオブジェクトではないことを知っておくべきではありませんか?デバッガーを使用すると、SaveChangesメソッドを呼び出す直前のポイントまで追跡できます。Classroom.idはデータベースにあるものです。どうしたの?EFは、前のクラスルームとまったく同じプロパティを備えた新しいクラスルームを追加しますが、新しいPKを備えています。私はここで何が間違っているのですか?

これは、一般的なCRUD操作に使用されるコードです(これらは私のDbContextにあります)更新と削除の両方が正常に機能します。

    public void Update(DbSet MySet, object Obj)
    {
        MySet.Attach(Obj);
        var Entry = this.Entry(Obj);
        Entry.State = EntityState.Modified;
        this.SaveChanges();
    }


    public void Insert(DbSet MySet, object Obj)
    {
        MySet.Add(Obj);
        this.SaveChanges();
    }


    public void Delete(DbSet MySet, object Obj)
    {
        MySet.Attach(Obj);
        var Entry = this.Entry(Obj);
        Entry.State = EntityState.Deleted;
        this.SaveChanges();
    }
4

1 に答える 1

5

エンティティをどのように更新または作成しているかについての実際のコードを見なければSubject、それを判断するのは困難です。ただし、クラスルームを接続していない可能性があるため、EF はエンティティが新しいものであると想定していますが、実際にはそうではありません。

     using (Model m = new Model())
     {
        m.Subject.Add(subject);
        m.Classrooms.Attach(subject.Class);
        m.SaveChanges();           
     }

PK は同じですが、Context にアタッチしないと、EF はユーザーの意図を理解する方法がありません。エンティティをアタッチすると、コンテキストに必要なものが明示的に伝えられます。

于 2012-10-22T01:19:47.880 に答える