Как обновить сложную модель в ASP.NET MVC 3

Я пытаюсь обновить сложную модель в одном представлении. Я использую ASP.NET MVC3, Entity Framework с Code first, unit of work, generic repository pattern... но когда я пытаюсь обновить модель, я получаю эту ошибку:

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

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

public class TransactionViewModel
{
     public Transaction Transaction { get; set; }
     public bool IsUserSubmitting { get; set; }
     public IEnumerable<SelectListItem> ContractTypes { get; set; }
}

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

public class Transaction
{
    [Key]
    public int Id { get; set; }

    public int CurrentStageId { get; set; }

    public int? BidId { get; set; }

    public int? EvaluationId { get; set; }

    public virtual Stage CurrentStage { get; set; }

    public virtual Bid Bid { get; set; }

    public virtual Evaluation Evaluation { get; set; }

}

public class Bid
{
    [Key]
    public int Id { get; set; }

    public string Type { get; set; }

    public DateTime? PublicationDate { get; set; }

    public DateTime? BidOpeningDate { get; set; }

    public DateTime? ServiceDate { get; set; }

    public string ContractBuyerComments { get; set; }

    public string BidNumber { get; set; }

    public DateTime? ReminderDate { get; set; }

    public DateTime? SubmitDate { get; set; }

}

Используя ту же модель представления, я могу создать объект транзакции, который будет заполнять базу данных следующим образом.

Id: 1, CurrentStageId: 1, BidId: 1, EvaluationId: 1

но, когда я пытаюсь обновить свойства внутри этих навигационных свойств, эта строка вызывает ошибку, в контроллере:

[HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
    if (ModelState.IsValid)
    {
        -> unitOfWork.TransactionRepository.Update(model.Transaction);
           unitOfWork.Save();
           return RedirectToAction("List");
    }
}

В общем хранилище:

public virtual void Update(TEntity entityToUpdate)
{
 -> dbSet.Attach(entityToUpdate);
    context.Entry(entityToUpdate).State = EntityState.Modified;
}

Проблема усложняется тем, что я должен иметь возможность редактировать любое из полей (свойств) в любом из навигационных свойств в объекте Transaction в рамках одного представления.

6
задан ljustin 13 January 2012 в 20:15
поделиться