PUTの.net web api更新モデル

だから私はモデルを更新しようとしている。私のモデルがどのように設定されているのです:

public class Event{
  public int Id {get;set;}
  public string Name {get;set;}
  public DateTime Date {get;set;}
  public int Organizerid {get;set;}

  public virtual User Organizer {get;set;}
}

public class Organizer{
  public int Id {get;set;}
  public string Name {get;set;}

  pubilc virtual iCollection Events {get;set;}
}

今私はイベントのイベントモデル(EventViewModel)を作成しました。定期的なイベントを返すとループエラーが発生し、プルする各モデルにあるすべての仮想で[JsonIgnore]を使用する必要があります。また、Web APIが現在のモデルについての情報をあまりにも多く返すのを防ぎます。必要のない情報

私のViewModel

public class EventVM {
    public string Name {get;set;}
    public DateTime Date {get;set;}
}

これが、私がPUTをどのように処理したかで

[HttpPut]
        public HttpResponseMessage Put(int eventId, EventVM event)
        {
            if (ModelState.IsValid && eventId== event.Id)
            {

                try
                {
                    Event upEvent = dbcontext.Event.FirstOrDefault(e => e.Id == eventId);
                    upEvent.Name = eventVM.Name;
                    upEvent.Date = eventVM.Date;

                    dbcontext.SaveChanges();
                    return Request.CreateResponse(HttpStatusCode.OK);
                }catch(Exception ex){
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                }
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
        }

私の問題は、それが更新を保存していないということです。私はTryUpdateModelをやっていますが、WebApiで使うことはできません。助けて!思考?

1
私の悪い、私はちょうどそれを変更しました。別のプロジェクトから来た
追加された 著者 gdubs,
はい、私はIDを持つインスタンスを取得できます。それは文脈につながっているように見えません。
追加された 著者 gdubs,
私がOPで言ったように、これはMVC Htmlではなく、Web APIです。あなたが投稿したリンクとは異なり、名前空間にtryupdatemodelはありません。私はあなたがformupにtryupdatemodelについて何を意味するのか知っています。それは私が一般的に投稿に使うものです。データ/値は、フィドラーまたはiosアプリのいずれかの設定から取得されます。
追加された 著者 gdubs,
インスタンス名を変更しましたが、それと同じです。問題は、私がupEventに置いた更新が保存されていないことです。私はTryUPdateModelの対応がwebapiのものであることを理解しようとしていますか?またはそこにありますか? html mvcのtryupdatemodelがインスタンスを更新し、dbcontext.savechangesを呼び出すと変更が保存されるため、webapiの名前空間では変更されていないようです。
追加された 著者 gdubs,
問題はあなたのフォームがおそらく記事を投稿しているということです、これは既にここにあります: stackoverflow.com/questions/8182620/… モデルをポストするだけでなく、tryupdatemodelを使用しますが、モデルではなくformcollectionフォームを使用します。TryUpdateModel (formcollection);
追加された 著者 davethecoder,
あなたは eventId == event.Id をテストしますが、viewmodel EventVMではIdプロパティが表示されません。これはタイプミスですか、それとも過去のことは決してありませんか?
追加された 著者 AardVark71,
どのデータベースを使用していますか? "icdb.SaveChanges()"私はそれがdbcontext.SaveChanges()であるべきだと思います。
追加された 著者 Stay Foolish,
あなたはデバッグを入れましたか?私はエンティティフレームワークを使用していると仮定します。私はコードが正しいと思うのですが...あなたが渡したIDでイベントを取得できることを確認してください
追加された 著者 Stay Foolish,
私は何が問題なのか分かりません。エンティティがdbcontext.SaveChanges()でデータベースに保存されないという問題はありますか?コードを修正できますか?あなたは多くの間違いや誤りを抱えています。 1つの例はevent.Id(キーワードイベントは予約されており、変数として使用することはできません。IdはEvenVMでは除外されません)。あなたの例を実行可能にしてください。
追加された 著者 jan salawa,
エンティティフレームワークをコンテキストテクノロジとして使用していますか? dbcontextオブジェクトにはどのようなアクセス権がありますか?
追加された 著者 jan salawa,

3 答え

あなたのコードのどこかにあるのでしょうか?

context.Configuration.AutoDetectChangesEnabled = false;

イベントを修正した後、コンテキストがプロパティを変更されたものと見なしているかどうかをチェックすることもできます

var nameIsModified = dbcontext.Entry(upEvent).Property(u => u.Name).IsModified;

また、データベースを強制的に更新することもできます(ただし、これを解決策としては考えませんが、問題を診断するまで回避策として検討します)

dbcontext.Entry(upEvent).Property(u => u.Name).IsModified = true;

Marking a property as modified forces an update to be send to the database for the property when SaveChanges is called even if the current value of the property is the same as its original value - MSDN

0
追加された

あなたがEntity Frameworkを使用していて、あなたの例が実際のコードからいくらか不完全であるかもしれないと仮定すると、それは分離されたエンティティで問題になる可能性があります。

次の行に沿って何かを追加してみてください:

upEvent.State = EntityState.Modified);
dbcontext.SaveChanges();

dbcontext.SaveChanges();

詳細については、この質問をご覧ください。

0
追加された
upEventにStateプロパティが含まれていません。
追加された 著者 Piotr Perak,
OK、おそらくdbcontext.ObjectStateManager.ChangeObjectState(upEvent、EntityState.Modified)のようなものを試してみてください。
追加された 著者 JBeagle,

私はあなたがこの方法を打つことを知っていると仮定しています...そう

  1. Check that the params are getting bound, if not you'll never make it past your first check and you won't see an error because the mv params aren't required. Well you'll see a bad request on the client but nothing in code.

  2. As ArdVark71 pointed out, your view model doesn't contain an id

  3. Make sure your dbContext is not null

  4. In your try upEvent.Name = eventVM.Name; upEvent.Date = eventVM.Date; eventVM doesn't exist

  5. Does your entity have requirements that you aren't populating? Like the organizer?

  6. Also, Date & Name are bad variable names, our db guys would go nutz =]

とにかく、それはコードレビューのようにあまりにも聞こえたが、コードの問題があるときにトラブルシューティングするのは難しい場合は申し訳ありません。また、これらすべてがちょうどタイプミスであると仮定すると、dbcontextなどで問題が発生する可能性があります。他のすべてが正しいと思われる場合は、コードをステップ実行してdbcontextを参照してください。

がんばろう

0
追加された