Обновление ссылок с использованием структуры сущностей в ASP.NET MVC 3 - PullRequest
0 голосов
/ 18 октября 2011

Я определил следующие два класса:

public class User
{
    public System.Guid UserId { get; set; }
    public System.Guid? ContactId { get; set; }
    public string UserName { get; set; }
    public virtual Contact Contact { get; set; }
}

public class Contact
{
public System.Guid ContactId { get; set; }
    public string PhoneNumber { get; set; }
}

И ниже приведено сопоставление:

this.HasOptional(u => u.Contact)
.WithMany()
.HasForeignKey(u => u.ContactId);

Я определил страницу редактирования в MVC 3 для обновления информации пользователя,страница содержит свойства пользователя + свойства контакта пользователя:

<div class="editor-field">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>

<div class="editor-field">
@Html.EditorFor(model => model.Contact.PhoneNumber)
@Html.ValidationMessageFor(model => model.Contact.PhoneNumber)
</div>

И в методе поста контроллера:

[HttpPost]
public ActionResult Edit(User user)
{
    if (ModelState.IsValid)
    {
        context.Entry(user).State = EntityState.Modified;
        context.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(user);
}

Но это выдает:
A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship. в строке: context.Entry(user)...,

В чем причина этого исключения?и как я могу обновить Пользователь и контактные лица, не конфликтуя друг с другом в MVC 3?
Спасибо.

1 Ответ

3 голосов
/ 19 октября 2011

Есть ли у вас свойства User.ContactId и User.Contact.ContactId в скрытых полях на странице и опубликовать их обратно?Я считаю, что исключение говорит о том, что свойство первичного ключа User.Contact.ContactId из Contact (принципал) не имеет того же значения, что и значение внешнего ключа User.ContactId из User (зависимый).Это "значения свойств, которые определяют ссылочные ограничения" , и они "не согласованы" .

Кстати: установка состояния Modified в context.Entry(user).State = EntityState.Modified влияет только на скалярные и сложные свойства объекта user.Если пользователь вашего представления также мог изменить данные Contact (свойство навигации), вы также должны установить состояние этого объекта на Modified:

context.Entry(user).State = EntityState.Modified;
context.Entry(user.Contact).State = EntityState.Modified;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...