2015-03-10 5 views
3

Я пытаюсь обновить базу данных, используя рамку сущности, я сопоставить свои объекты в ViewModels используя automapper, и карты его обратно таким же образом:Automapper рамка сущности внешний ключ является нулевым

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([FromJson] MyCVViewModel model) 
{ 
    var userId = User.Identity.GetUserId(); 
    //find the cv 
    CV cv = repository.FindCV(model.CVId); 

    //auto mapper mapping 
    Mapper.CreateMap<MyCVViewModel, CV>(); 
    Mapper.CreateMap<MyCompanyViewModel, Company>(); 
    cv = Mapper.Map<MyCVViewModel, CV>(model, cv); 

    //edit 
    repository.EditCV(cv); 
} 

Когда я карта обратно , внешний ключевой CVid внутри компании сущности становится 0, я думаю, что что-то было потеряно во время процесса сопоставления, как вы сопоставляете внешний ключ?

enter image description here

Вот моя модель представления и сущность:

вид Модель:

public class MyCVViewModel 
{ 
    public int CVId { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "Title cannot exceed 100 characters.")] 
    [Display(Name = "Title")] 
    public string Title { get; set; } 
    [Required] 
    [StringLength(1000, ErrorMessage = "Statment cannot exceed 1000 characters.")] 
    [Display(Name = "Statement")] 
    public string Statement { get; set; } 

    public bool Reference { get; set; } 

    public List<MyCompanyViewModel> Companies { get; set; } 
} 

public class MyCompanyViewModel 
{ 
    [Required] 
    [StringLength(100, ErrorMessage = "Company Name cannot exceed 100 characters.")] 
    [Display(Name = "Company Name")] 
    public string CompanyName { get; set; } 
    [Required] 
    [StringLength(100, ErrorMessage = "Job Title cannot exceed 100 characters.")] 
    [Display(Name = "Job Title")] 
    public string JobTitle { get; set; } 
    [Required] 
    [DataType(DataType.Date)] 
    [Display(Name = "Start Date")] 
    public DateTime StartDate { get; set; } 
    [Required] 
    [DataType(DataType.Date)] 
    [Display(Name = "End Date")] 
    public DateTime EndDate { get; set; } 
    [Required] 
    [StringLength(1000, ErrorMessage = "Job Description cannot exceed 1000 characters.")] 
    [Display(Name = "Job Description")] 
    public string Description { get; set; } 
} 

Entity:

public class CV 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int CVId { get; set; } 
    public string Title { get; set; } 
    public string Statement { get; set; } 
    public bool Reference { get; set; } 

    public virtual ICollection<Company> Companies { get; set; } 
} 

public class Company 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int CompanyId { get; set; } 

    public string CompanyName { get; set; } 
    public string JobTitle { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public string Description { get; set; } 

    public virtual CV CV { get; set; } 
    public int CVId { get; set; } 
} 

и это сообщение об ошибке при попытке обновлено:

Операция завершена: связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не имеют значения NULL. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению.

Я вижу, где проблема, но не знаю, как сказать automapper сохранить значение внешнего ключа

+0

Где вы можете решить эту проблему? Я столкнулся с подобным, и не только когда я вставляю новые, но и когда я пытаюсь удалить записи «child» ..... Что касается нового «ребенка» для тестирования, я смог установить правильный идентификатор, и он работает , Но для удаления у меня все еще нет решения. У тебя есть? – Dryadwoods

ответ

2

MyCompanyViewModel класс не содержит определения CVId собственности, поэтому по умолчанию Automapper не знает где он должен принять значение для инъекций в CompanyCVId. Просто определить его:

public class MyCompanyViewModel 
{ 
    public int CVId { get; set; } 
    // Other properties 
} 

Тогда для каждого CompanyViewModel оных соответствующего скрытое поле ввода в поле зрения:

@for (int i = 0; i < Model.Companies.Count; i++) 
{ 

    // ... 

    @Html.HiddenFor(m => Model.Companies[i].CVId) 

    // ... 

} 

и вы хорошо идти!

+0

Извините, что не работает, такая же проблема – Mindless

+0

@EricWang, вам нужно будет добавить скрытое поле ввода для каждой компании в списке. Ищите подробности в ответе. Если он по-прежнему не помогает, укажите код представления. – Deilan

Смежные вопросы