これが私の問題です。保存と読み込みにフラット ファイルを使用していた古いテキスト ベースのゲームを復活させました。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 に設定されています。この値は、保存時にデータベースに反映されません。