1

私は MVC4 を学ぼうとして多くの記事を読んできましたが、エンティティがデータベースに更新されない理由に困惑しています。MVC4 VS2012 インターネット テンプレートを変更しようとしています。

コントローラーのアクションは次のとおりです。

[HttpPost, ActionName("Approve")]
[Authorize]
public ActionResult ApproveConfirmed(long id)
{
    using (StudentiContext context = new StudentiContext())
    {
       // context.Configuration.AutoDetectChangesEnabled = false;
    var studente = (from d in context.STUDENTI_STRANIERI_MASTER_REG
            where d.ID_PERSONA == id
            select d).Single();

    STUDENTI_STRANIERI_MASTER_REG st2 = studente;

    st2.ESITO = 1;

    //studente.ESITO = 1;
    var statos = context.Entry(studente).State;
    Console.WriteLine("Before DetectChanges: {0}",statos);
    //context.ChangeTracker.DetectChanges();

    context.Entry(studente).State = EntityState.Modified;



    context.Entry(studente).CurrentValues.SetValues(st2);

      //  var tracked = context.ChangeTracker.Entries();

    context.Entry(studente).Property( o => o.ESITO ).IsModified = true;
    TryUpdateModel(studente);
    context.SaveChanges();

    Console.WriteLine("After DetectChanges: {0}",statos);

    return RedirectToAction("PrivateIndex");
    }
}

目的は、1 つのプロパティ ESITO を更新して 1 に設定することだけです。現在、その値は 2 です。これがモデルです。

namespace MvcStudenti2.Models
{
using System;
using System.Collections.Generic;

public partial class STUDENTI_STRANIERI_MASTER_REG
{
    public long ID_PERSONA { get; set; }
    public string COGNOME { get; set; }
    public string NOME { get; set; }
    public string SESSO { get; set; }
    public System.DateTime DATA_NASCITA { get; set; }
    public long ID_STATO_NASCITA { get; set; }
    public string LUOGO_NASCITA_ESTERO { get; set; }
    public string CODICE_FISCALE { get; set; }
    public string TITOLO_POSSEDUTO { get; set; }
    public Nullable<short> DURATA_TITOLO { get; set; }
    public string VOTAZIONE { get; set; }
    public string UNI_PROVENIENZA { get; set; }
    public long ID_STATO_UNI { get; set; }
    public string CERT_LINGUISTICA { get; set; }
    public string CERT_PUNTEGGIO { get; set; }
    public string NOTE { get; set; }
    public System.DateTime DATA_RICHIESTA { get; set; }
    public short ESITO { get; set; }
    public string CDS_COD { get; set; }
    public string EMAIL { get; set; }
    public string NUMERO_TELEFONO { get; set; }
    public string INDIRIZZO { get; set; }
    public string CAP_INDIRIZZO { get; set; }
    public string CITTA { get; set; }
    public long ID_STATO_INDIRIZZO { get; set; }
    public string DESCRIZIONE_CIT_NAZ { get; set; }
    public Nullable<System.DateTime> DATA_COMPLETAMENTO_ATTESO { get; set; }
    public Nullable<System.DateTime> ANNO_COMPLETAMENTO { get; set; }
    public Nullable<short> DURATA_CORSO_COMPLETATO { get; set; }
    public decimal GPA { get; set; }
    public string ALTRI_TITOLI { get; set; }
    public string MADRELINGUA { get; set; }
    public Nullable<short> CERT_TOEFL_PUNT { get; set; }
    public string CERT_FIRSTCERT_GRADE { get; set; }
    public Nullable<short> CERT_FIRSTCERT_PUNT { get; set; }
    public byte[] FILE_CV { get; set; }
    public byte[] FILE_CARRIERA { get; set; }
    public byte[] FILE_CERT_LINGUA { get; set; }
    public byte[] FILE_DOC_IDENTITA { get; set; }
    public string PWD { get; set; }
    public string FILE_CV_NOME { get; set; }
    public string FILE_CARRIERA_NOME { get; set; }
    public string FILE_CERT_LINGUA_NOME { get; set; }
    public string FILE_DOC_IDENTITA_NOME { get; set; }
    public string FILE_CV_TIPO { get; set; }
    public string FILE_CARRIERA_TIPO { get; set; }
    public string FILE_CERT_LINGUA_TIPO { get; set; }
    public string FILE_DOC_IDENTITA_TIPO { get; set; }
    public Nullable<short> STATO { get; set; }
    public Nullable<short> VALUTATO { get; set; }
    public Nullable<short> ARCHIVIATO { get; set; }
    public string CDS_COD_2 { get; set; }
    public Nullable<short> MAIL_INVIATA { get; set; }
    public string LINK_ULTIMO_CORSO { get; set; }
    public Nullable<short> ATTIVO { get; set; }
    public byte[] FILE_LETTERA_ACCETTAZIONE { get; set; }
    public string FILE_LETTERA_ACCETTAZIONE_NOME { get; set; }
    public string FILE_LETTERA_ACCETTAZIONE_TIPO { get; set; }
}
}

SaveChanges()私が読んだところならどこでも、おそらくEntityState.Modified.

エンティティ全体をアクションに渡すと、エンティティを正しく編集できますが、この場合、承認ビューは詳細テンプレートに基づいて構築されているため、そこから POST するものは何もありません (そして、私はしたくないですto: 隠しフィールドを挿入して投稿することもできますが、コードから 1 つのフィールドを更新しようとしており、エンティティ全体が更新または上書きされるかどうかはわかりません)。

statosエンティティに対してクエリを実行したため、正しく理解できれば「変更済み」になります。

私が理解していないもう 1 つのことは、ESITO が update -also- を取得しstudente、その後「2」に戻る理由ですSaveChanges()

プロパティの変更は検出されていますか? 他の場所で提案されているように、すべてのアクションをusingブロックでラップしたので、複数の contextx/instances を持ちません。

誰かが私が間違っていることを指摘してもらえますか? 上記のコードはおそらく過剰に冗長ですが、私は SO で見つけたすべてを試してきました。

みんな、ありがとう。

4

1 に答える 1

0

ESITO以下は、プロパティを変更するために必要なすべてです。

[HttpPost, ActionName("Approve")]
[Authorize]
public ActionResult ApproveConfirmed(long id)
{
    using (StudentiContext context = new StudentiContext())
    {
       // context.Configuration.AutoDetectChangesEnabled = false;
    var studente = (from d in context.STUDENTI_STRANIERI_MASTER_REG
            where d.ID_PERSONA == id
            select d).Single();

    studente.ESITO = 1;
    context.SaveChanges();

    return RedirectToAction("PrivateIndex");
    }
}
于 2013-07-25T14:56:22.870 に答える