私は自分のプロジェクトにすべてを入れて EF で動作するように一生懸命努力していますが、それは本当に難しくなっており、データベースのすべてのインとアウトのコーディングに対して EF に依存することが本当に賢明な動きなのか疑問に思うことがあります。 )。まあ、私の問題はまだ1-Nの作成/編集/削除機能に関連しています(単純なはずですよね?)。
わかりました、ここに私のコードに相当する単純なものを貼り付けています。
エンティティについては、メイン クラスを次のように取得しました。
[Table("OLIM_LOTE")]
public class Lote
{
[Key]
[Column("LOTE_ID_LOTE")]
public int? IDLote { get; set; }
[Column("LOTE_TX_OBS")]
public string Obs {get;set;}
[Column("LOTE_TX_DOCUMENTO_EXTRA")]
public string DocumentoExtra { get; set; }
[NotMapped]
public List<DocumentoLote> Documentos { get; set; }
public void LoadLists()
{
OlimpiqueDBContext myDbContext = new OlimpiqueDBContext();
var docs = (from doc in myDbContext.DocumentosLote
where doc.IDLote == this.IDLote
select doc);
this.Documentos = docs.ToList<DocumentoLote>();
}
}
[nullable int を使用したことに注意してください。キーの場合 - そうでない場合、作成時に値を要求する検証例外がスローされます]
子クラスについては、これを取得しました:
[Table("OLIM_DOCUMENTO_LOTE")]
public class DocumentoLote
{
[Key]
[Column("DOLO_ID_DOCUMENTO_LOTE")]
public int? IDDocumentoLote { get; set; }
[Column("DOCU_ID_DOCUMENTO")]
[ForeignKey("Documento")]
public int IDDocumento { get; set; }
public virtual Documento Documento { get; set; }
[Column("LOTE_ID_LOTE")]
[ForeignKey("Lote")]
public int IDLote { get; set; }
public virtual Lote Lote { get; set; }
}
[子クラスには、「IDLote」および「Lote」属性である所有者クラスへの参照があり、所有者クラスには子クラス インスタンスのリストがあることに注意してください。これが何らかの問題に関連していること]
クラスLoteに関連する読み取り/書き込み機能を備えたVS2012によって自動的に生成されたコントローラーとビューを取得しました。ビューで行ったことは次のように説明できます: Jquery DataTable を使用して子クラス データを管理しました (ユーザーは DataTable に "N" 個のインスタンスを追加できます)。Post ボタンの代わりに、Form と DataTable からすべてのデータを取得し、JSON オブジェクトでラップして、Ajax 経由でコントローラーに送信するだけの JS メソッドの呼び出しを使用しました。
それを受け取るコントローラーメソッドは、次のように簡略化できます。
[HttpPost]
public JsonResult Edit(Lote lote)
{
try
{
if (ModelState.IsValid) //<< HAVING PROBLEMS HERE... DETAILS BELOW
{
if (lote.IDLote.HasValue)
{
//Separete updates/inserts from deletes
List<int?> dbDocs = db.DocumentosLote
.Where(dt => dt.IDLote == lote.IDLote)
.Select(dt => dt.IDDocumentoLote)
.ToList();
List<int?> postedDocs = lote.Documentos
.Select(pt => pt.IDDocumentoLote)
.ToList();
List<int?> deletedDocs = dbDocs
.Except(postedDocs).ToList();
//Perform deletes
foreach (var delDocId in deletedDocs)
{
if (delDocId.HasValue)
{
DocumentoLote delDoc = db.DocumentosLote
.Where(dt => dt.IDLote == lote.IDLote && dt.IDDocumentoLote == delDocId)
.Single();
db.Entry(delDoc).State = EntityState.Deleted;
}
}
//Perform insert and updates
foreach (var doc in lote.Documentos)
{
if (doc.IDDocumentoLote.HasValue)
{
db.Entry(doc).State = EntityState.Modified;
}
else
{
db.Entry(doc).State = EntityState.Added;
doc.IDLote = (int)lote.IDLote;
}
}
}
else
{
db.Lotes.Add(lote);
}
db.SaveChanges();
// If Sucess== 1 then Save/Update Successfull else there it has Exception
return Json(new { Success = 1, ex = "" });
}
else
{
return Json(new { Success = 0, ex = "Falha ao tentar salvar os dados" });
}
}
catch (Exception ex)
{
// If Sucess== 0 then Unable to perform Save/Update Operation and send Exception to View as JSON
return Json(new { Success = 0, ex = ex.Message.ToString() });
}
}
問題点: ここまで来るまでに本当に多くのことを経験しましたが、今は 2 つの問題しかありません。1 つ目は、作成時に IDLote が必要であると言って Validation Exception をスローしていることです (ただし、作成の時点で所有者クラス自体にまだ Id がない場合はどうすればよいでしょうか?) 2 番目の問題: 削除がまったく機能しない! どのようにコーディングしても、「異なる ObjectContext オブジェクトにアタッチされているため、オブジェクトを定義できません」という例外がスローされます。これは、所有者と子のクラス間の双方向参照と関係があると本当に感じていますが、それでも、何が起こっているのか、それを解決する方法についての手がかりはありません
私はここで本当に迷っていると感じ始めています。これに関する任意のアイデアは非常に高く評価されます。ありがとう