0

EF4.1 で ASP.NET-MVC3 のナビゲーション プロパティを使用してエンティティを編集しようとしています。

私のモデル:

[DataContract]
public class Event
{       
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public Place Place { get; set; }
}

[DataContract]
public class Place
{
    [Key]
    public string ID { get; set; }
    public string Name { get; set; }
}

私のデータコンテキストクラス:

public class myDB: DbContext
{
    public DbSet<Event> Events { get; set; }
    public DbSet<Place> Places { get; set; }
}

私のコントローラーポスト編集方法:

[HttpPost]
public ActionResult Edit(Event @event, string placeID)
{
    if (ModelState.IsValid)
    {
        @event.Place = _db.Places.Find(placeID);

        _eventoDB.Entry(@event).State = EntityState.Modified;
        _eventoDB.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(@event);
}

@event場所がnullから新しい場所に変更されたことがわかりますが@event.Place = _db.Places.Find(placeID);SaveChanges場所IDは編集前と同じままです。理由はありますか?ありがとう

4

2 に答える 2

1

Event オブジェクトがコンテキストに関連付けられていないため、これが発生している可能性があります。MVC 要求からの EF オブジェクトは、手動でアタッチするまでコンテキストの一部ではありません。これはそれを修正するかもしれません:

[HttpPost]
public ActionResult Edit(Event @event, string placeID)
{
    if (ModelState.IsValid)
    {
        _eventoDB.Events.Attach(@event);
        @event.Place = _db.Places.Find(placeID);
        // should not need to mark as modified, previous line will do it
        // _eventoDB.Entry(@event).State = EntityState.Modified;
        _eventoDB.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(@event);
}
于 2012-07-22T21:25:19.880 に答える
0

SonicDynamite ソリューションを試した後、次の例外が発生しました。保存中の例外は、エンティティ タイプで外部キー プロパティを公開することで簡単に作成できます。詳細については、InnerException を参照してください。

いくつかのグーグル調査の後、プロパティを追加することがわかりました

public string PlaceId { get; set; }

私の Event エンティティに問題を解決します。

さらに、SonicDynamite が提案するようなイベント オブジェクトをアタッチする必要はありません。

PlaceId プロパティで機能する理由がわかりません。誰か説明してもらえますか?

ありがとう!

于 2012-07-23T10:58:42.183 に答える