2017-06-22 4 views
1

私はASP.Net MVCプロジェクトでEF6とMapsterを使用しています。私の編集ポストコントローラでは、データ入力フォームの結果を保存しようとしています。フォームには、複数選択リストボックスがあります。複数選択リストボックス内の選択が正しく渡されていますが、マルチ選択リストの選択項目をdbに保存する正しい方法を理解していません。コードを使用すると、DisplayNameプロパティは保存されますが、チームは保存されません。エンティティとサブエンティティのリスト間のキーを更新していますか?

var myRecord = TypeAdapter.Adapt<MyRecord>(myRecordViewModel); 
    myRecord.Teams   = db.Teams.Where(a => myRecordViewModel .SelectedTeamIDs.Contains(a.TeamID)).ToList();    
    myRecord.DisplayName  = myRecordViewModel.Name; 
    db.Entry(myRecord).State = EntityState.Modified; 
    db.SaveChanges(); 

myRecordクラス:

public class MyRecord 
{ 
    [Key] 
    public int Id { get; set; } 
    public string DisplayName { get; set; } 
    public virtual ICollection<Team> Teams { get; set; } 
} 

チーム変更を保存するには、

コントローラコードを(チーム表はmyRecordテーブルに多くの関係に多くを持っています)クラス:

public partial class Team 
{ 
    public int TeamID { get; set; } 
    public string TeamName { get; set; } 
    public virtual ICollection<MyRecord> MyRecords{ get; set; } 
} 

これをデータベースにどのように保存する必要がありますか?

答えて

2

StateModified(エンティティをコンテキストに添付し、すべてのプリミティブプロパティを変更済みとしてマークする)は、単純なシナリオでは機能しますが、関連するデータはありません。ここ

は、追加のデータベース・トリップを行う一連の動作であるが、正確に変更を適用するために必要なデータベース操作を識別するために、EF変更トラッカを可能にする:

(1)を含む、データベースから元のエンティティをロードコレクション (2) は(4)保存 (3)新しいデータでコレクションを交換し、マスタ情報を更新

var myRecord = TypeAdapter.Adapt<MyRecord>(myRecordViewModel); 
myRecord.DisplayName = myRecordViewModel.Name; 
// (1) 
var dbRecord = db.MyRecords.Include(x => x.Teams).FirstOrDefault(x => x.Id == myRecord.Id); 
// (2) 
db.Entry(dbRecord).CurrentValues.SetValues(myRecord); 
// (3) 
dbRecord.Teams = db.Teams.Where(a => myRecordViewModel .SelectedTeamIDs.Contains(a.TeamID)).ToList(); 
// (4) 
db.SaveChanges(); 
関連する問題