1

これが私の問題です。保存と読み込みにフラット ファイルを使用していた古いテキスト ベースのゲームを復活させました。MVC 4 と Entity Framework 5 および SQL Server 2012 を使用して、古い C++ コードを C# に移植してきました。Razor ビューを使用したページのレンダリングは簡単です。部屋を作成/編集するためのウィザードを作成するときに問題が発生します。

Room には、Exit オブジェクトのコレクションが含まれています。最初に部屋を作成して出口を割り当てると、すべて正常に機能します。うまくいかないのは、部屋を編集して出口を変更したときです。編集コードにブレークポイントを配置すると、終了値が変更され、ルームの状態を変更済みに設定しても問題なく、ルームは問題なく保存されているように見えます。つまり、名前と説明の変更が更新されます。ただし、終了情報はそうではありません。

出口のリストをループして、各出口を変更済みとしてマークしようとしましたが、保存中にあらゆる種類のエラーがスローされます。私の質問はこれです。部屋モデルの出口のリストを更新する正しい方法は何ですか?

ここで他の解決策を試してみました。更新して、保存する前に新しい値を古い値にコピーしましたが、何も機能しません。exit オブジェクトをデータベースに更新するにはどうすればよいですか。前もって感謝します。

public abstract class Entity
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }
    public virtual string Description { get; set; }

}

public class Room : Entity
{
    public virtual ICollection<Exit> Exits { get; set; }
}

public class Exit : Entity
{
    // The room to which we belong
    public int RoomId { get; set; }
    public Room Room { get; set; }

    // The room to which we connect
    public int? ToRoomId { get; set; }
    public Room ToRoom { get; set; }
}

私のリポジトリメソッド

public IEnumerable<Room> AllRoomsInclusive()
{
    var rooms = Context.Rooms.Include(r => r.Exits).ToList();
    return rooms;
}

public void Update(Room room)
{
    Context.Entry(room).State = EntityState.Modified;
}

public void Save()
{
    Context.SaveChanges();
}

コントローラーの編集メソッドで ToRoomId が更新されていることがわかります。つまり、get メソッドでは ToRoomId 6 で、post メソッドでは編集で ToRoomId 10 に設定されています。この値は、保存時にデータベースに反映されません。

4

0 に答える 0