簡體   English   中英

C#MVC保存子項列表

[英]C# MVC saving a list of sub items

我是MVC和實體框架工作的新手,但我遇到了一個問題,我不知道如何解決它,一些指導更受歡迎。 我正在編輯一個具有不同對象子列表的對象。 我有一個工作編輯屏幕但我無法將詳細信息存儲回數據庫。 我認為問題是圍繞數據庫的背景,但正如我所說,我是新手。 以下是我正在使用的2個類:

public class Role
{    
    [Key]    
    public string Role { get; set; }    
    public virtual ICollection<Template> Templates { get; set; }
}
public class Template
{    
    [Key][Required]    
    public string TemplateID { get; set; }    
    [Required]    
    public string Header { get; set; }    
    [Required][DataType(DataType.MultilineText)]    
    public string Description { get; set; }    
    public virtual ICollection<CorrespondenceRole> Roles { get; set; }
}

在我的背景下我也有這個

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{    
    modelBuilder.Entity<Template>()        
        .HasMany(c => c.Roles)        
        .WithMany(c => c.Templates)        
        .Map(m => m.ToTable("Template_Roles")            
            .MapLeftKey("TemplateID")            
            .MapRightKey("Role"));
}

如果我使用

public ActionResult Edit(Template ctemplate)
{
    db.Entry(ctemplate).State = EntityState.Modified;
    db.SaveChanges();
}

對模板對象的更改將記錄到數據庫中,但即使在db保存之前我硬編碼ctemplate.roles.add(somerole),也會完全忽略對角色列表的任何更改。

但是,如果我使用

public ActionResult Edit(Template ctemplate)
{
    Template ct = db.Templates.Find(ctemplate.TemplateID);
    ct.Roles.Add(db.Roles.Find("Other Party"));
    db.Entry(ct).State = EntityState.Modified;
    db.SaveChanges();
}

“角色”將保存在數據庫的模板中。 所以我可以使用這個代碼來找到對象,然后將所有表單字段復制到它並保存它但是當第一個選項確實有效但似乎沒有保存我的列表時它看起來很長。 任何意見或建議如何最好地保存對象及其相關的不同對象列表的更改? 謝謝。

更新我發現這對我有用,但我不知道它是否是最好的方法。

db.Entry(ct).State = EntityState.Modified;

foreach (var entity in db.Roles.Where(cr => cr.TemplateID == ct.ID))
    db.Roles.Remove(entity);

foreach (Role cr in ct.Roles)
    db.Roles.Add(cr);

db.SaveChanges();

這對我來說也有類似的問題!

foreach (var entity in db.Roles.Where(cr => cr.TemplateID == ct.ID)) {
                db.Entry(entity).State = EntityState.Modified;
            }

db.Roles.Remove(entity);  

在保存過程中,對象是否存在於ctemplate中? 在你看來你也是這樣做的:

foreach (var item in model.sub_object)
{
  @Html.TextBoxFor(m => item.whatever)
}

嘗試這樣的事情:

for (int i; i < model.sub_object.count(); i++)
{
  @Html.TextBoxFor(m => model.sub_object[i].field)
}

如果您的問題是我認為的問題,這將解決它。 問題是您需要更改列表中每個元素的EntityState。 嘗試這個:

public ActionResult Edit(Template ctemplate)
{
    db.Entry(ctemplate).State = EntityState.Modified;
    foreach (CorrespondenceRole role in ctemplate.Roles)
    {
        //Change role State -> EntityState.Modified
    }   
    db.SaveChanges();
}

如果您的元素附加到您的上下文,它們應該保留到數據庫...如果您有任何疑問,請告訴我...

希望這可以幫助。

我不知道有什么快速的方法。 從數據庫中獲取模板時,您也想加載相關的角色(查看Eager Loading); 這與您的問題無關,但可以節省數據庫往返次數。

一旦您的角色被上下文加載,您將不得不迭代它們並修改任何已更改的內容並添加新內容並刪除舊內容。 它是手動的,但它確保datacontext知道您想要在對象上更改的內容。

之后,在模板上調用save應該逐漸降低到角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM