C # MVC сохранение списка подпунктов - PullRequest
0 голосов
/ 30 июля 2011

Я новичок в работе с фреймами MVC и Entity, но я столкнулся с проблемой, и я не уверен, как ее решить, некоторые рекомендации более чем приветствуются.Я редактирую объект, у которого есть подсписок различных объектов.У меня есть рабочий экран редактирования, но я не могу получить информацию, сохраненную в базе данных.Я думаю, что проблема заключается в контексте БД, но, как я уже сказал, я новичок в этом.Вот 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();
}

Изменения вобъект шаблона записывается в базу данных, но любые изменения в списке ролей полностью игнорируются, даже если я хардкод 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();

Ответы [ 4 ]

1 голос
/ 21 сентября 2012

Присутствуют ли объекты в 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)
}
1 голос
/ 14 мая 2012

Это сработало для аналогичной проблемы для меня !!

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

db.Roles.Remove(entity);  
0 голосов
/ 30 июля 2011

Нет быстрого способа, о котором я знаю. Когда вы выбираете свой шаблон из базы данных, вы также хотите загрузить связанные роли (ищите Eager Loading); это не связано с вашей проблемой, но сэкономит вас при поездках по БД.

Как только ваши роли загружены контекстом, вам придется их перебирать, модифицировать все, что изменилось, добавлять новые и удалять старые. Это руководство, но оно гарантирует, что текст данных знает, что вы хотите изменить на объектах.

После этого вызов save для шаблона должен распространяться на роли.

0 голосов
/ 30 июля 2011

Если ваша проблема в том, что я думаю, это решит ее.Проблема в том, что вам нужно изменить 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();
}

Если ваши элементы привязаны к вашему контексту, они должны сохраниться в базе данных ... Дайте мне знать, если у вас есть какие-либо вопросы ...

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...